{{tag>dev python flask orm db sqlalchemy}} ====== Flask-SQLAlchemy : Mise en œuvre d'une relation many-to-many ====== :TODO: ====== Suppression des enregistrements orphelins dans une association many-to-many ===== Un cas typique est la gestion des étiquettes (tags) ou des mots-clés (keywords). Dans cet exemple on souhaite pouvoir associer des mots-clés à des jeux : * A un jeu on peut associer **0 ou plusieurs** mots-clés ; * Un mot-clé est associé à **1 ou plusieurs** jeux ; On définit bien une association plusieurs-à-plusieurs mais on ne souhaite pas conserver dans notre base des mots-clés seuls. Lorsqu'un jeu est supprimé, si parmi ses mots-clés certains ne sont plus utilisés, alors on veut les supprimer également. Ce comportement de suppression des enregistrements orphelins est bien pris en charge par l'ORM SQLAlchemy sur des associations de type one-to-many mais sa mise en œuvre sur des associations de type many-to-many est un peu plus délicate. Heureusement le package Python **SQLAlchemy-Utils** permet de mettre en œuvre se comportement via sa fonction **auto_delete_orphans**. Pour pouvoir utiliser la fonction ''auto_delete_orphans'' du package les associations définies via la fonction ''relationship'' doivent utiliser l'option historique **backref** ===== Références ===== * [[https://www.digitalocean.com/community/tutorials/how-to-use-many-to-many-database-relationships-with-flask-sqlalchemy|Comment utiliser une relation many-to-many dans Flask-SQLAlchemy (digitalocean.com)]] * [[https://docs.sqlalchemy.org/en/20/orm/cascades.html#cascade-delete-many-to-many|Utiliser la suppression en cascade sur une relation many-to-many (sqlalchemy.org)]] * https://stackoverflow.com/questions/26948397/how-to-delete-records-from-many-to-many-secondary-table-in-sqlalchemy ==== Supprimer les enregistrements orphelins ==== * [[https://github.com/sqlalchemy/sqlalchemy/wiki/ManyToManyOrphan|Supprimer les enregistrements orphelins d'une association many-to-many]] * [[https://app.readthedocs.org/projects/sqlalchemy-utils/downloads/pdf/stable/|Documentation package SQLAlchemy-Utils (readthedocs.org)]] * https://stackoverflow.com/questions/51335298/concepts-of-backref-and-back-populate-in-sqlalchemy * https://stackoverflow.com/questions/68355401/how-to-remove-sqlalchemy-many-to-many-orphans-from-database