Gabriel Mongeon

Official blog, et sûrement le seul...

Supabase et les relations entre les tables

Comment gérer les relations entre les tables dans Supabase Sharp

Lecture de 3 Minutes

Supabase et les relations entre les tables

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ées
  • PrimaryKey : Pour indiquer la clé primaire de la table
  • Column : Pour indiquer le nom de la colonne dans la base de données
  • Reference : Pour indiquer qu’il s’agit d’une clé étrangère
    • includeInQuery : 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.

Posts Récents