Supabase et les relations entre les tables
Comment gérer les relations entre les tables dans Supabase Sharp
Pour un de mes projets .NET, j’utilise Supabase pour stocker mes données. Supabase est une alternative open-source à Firebase. Il est basé sur PostgreSQL et fournit une API REST et des websockets pour interagir avec la base de données.
Pour connecter mon projet .NET à Supabase, j’utilise Supabase Sharp et vous pouvez trouver également la documentation sur le site officiel de Supabase.
La facilité d’utilisation de la librairie est vraiment intéressante et cela me permet également d’utiliser directement le site web de Supabase pour gérer mes données sans avoir à écrire de code pour le faire dans ma propre applications.
Cependant, la documentation n’est pas explicite lorsque l’on a des tables liés par des clés étrangères (FK). Voici comment j’ai réussi à obtenir les données de mes tables liées tout en utilisant des objets C# et quelques attributs de la librairie.
Modèle de données Supabase
Voici mon modèle de données dans Supabase:
Table Book
Id | Title | AuthorId |
---|---|---|
1 | Book1 | 1 |
2 | Book2 | 2 |
Le champ AuthorId
est une clé étrangère vers la table Author
.
Table Author
Id | Name |
---|---|
1 | John Doe |
2 | Jane Doe |
Le code C#
Classe de base
Le code simple pour définir les objets C# est le suivant:
public class Book
{
public string Title { get; set; }
public Author Author { get; set; }
}
public class Author
{
public string Name { get; set; }
}
Utilisation de Supabase Sharp
Définition des attributs
Pour que la librairie puisse comprendre les relations entre les tables, il faut ajouter des attributs à nos classes.
Table
: Pour indiquer le nom de la table dans la base de donnéesPrimaryKey
: Pour indiquer la clé primaire de la tableColumn
: Pour indiquer le nom de la colonne dans la base de donnéesReference
: Pour indiquer qu’il s’agit d’une clé étrangèreincludeInQuery
: Pour indiquer si la table liée doit être incluse dans la requête
[Table("Books")]
public class Book
{
[PrimaryKey("Id")]
public int Id { get; set; }
[Column("Title")]
public string Title { get; set; }
[Reference(typeof(Author), includeInQuery:true)]
public Author Author { get; set; }
}
[Table("Authors")]
public class Author
{
[PrimaryKey("Id")]
public int Id { get; set; }
[Column("Name")]
public string Name { get; set; }
}
Aller chercher les données
Pour aller chercher les données, il suffit d’utiliser la méthode Get
de la librairie.
var books = await supabase
.From<Book>()
.Get();
Puisque nous avons utilisé l’attribut Reference
avec includeInQuery:true
, la librairie va automatiquement aller chercher les données de la table Author
et les inclure dans l’objet Book
. Si nous aviions mis includeInQuery:false
, la librairie aurait retourné un objet Author
vide, mais avec l’attribut Id
correct. Pour aller chercher les données de la table Author
, il suffit de faire un appel à la méthode Get
de la librairie avec la en utilisant Select
et spécifié la table `Authors'.
var books = await supabase
.From<Book>()
.Select("*, Author(*)")
.Get();
Relation avec des clés étrangères optionnelles
Si la relation entre les tables est optionnelle, il suffit de déclarer l’objet comme nullable et ajouter l’attribut Reference
avec joinType: ReferenceAttribute.JoinType.Left
pour récupérer les objets qui n’ont pas de relation. Le code pour aller chercher les données reste le même.
[Table("Books")]
public class Book
{
[PrimaryKey("Id")]
public int Id { get; set; }
[Column("Title")]
public string Title { get; set; }
[Reference(typeof(Author),joinType: ReferenceAttribute.JoinType.Left, includeInQuery:true)]
public Author? Author { get; set; }
}
Conclusion
Supabase Sharp est une librairie simple et efficace pour interagir avec Supabase. Les attributs Table
, PrimaryKey
, Column
et Reference
permettent de définir les relations entre les tables et de récupérer les données facilement. La librairie est en constante évolution et je vous invite à consulter la documentation pour plus d’informations.