| Prochaine révision | Révision précédente |
| dev:python:flask:flask-sqlalchemy:relation_one-to-many [2024/12/07 13:37] – créée yoann | dev:python:flask:flask-sqlalchemy:relation_one-to-many [2025/08/03 10:43] (Version actuelle) – yoann |
|---|
| |
| |
| | :TODO_DOCUPDATE: |
| |
| ====== Flask-SQLAlchemy : relation one-to-many ====== | ====== Flask-SQLAlchemy : relation one-to-many ====== |
| |
| * Un magasin (Shop) vend un ou plusieurs produits (Product); | * Un magasin (Shop) vend un ou plusieurs produits (Product); |
| * Un produit est vendu par un seul magasin. | * Un produit est stocké dans un seul magasin. |
| |
| ===== Implémentation ===== | ===== Implémentation ===== |
| Ci-dessous l'application Flask minimaliste implémentant les deux classes du modèle et la relation one-to-many. | Ci-dessous l'application Flask minimaliste implémentant les deux classes du modèle et la relation one-to-many. |
| |
| <code python app.py> | <code python app.py [enable_line_numbers=“true”]> |
| from flask import Flask | from flask import Flask |
| from flask_sqlalchemy import SQLAlchemy | from flask_sqlalchemy import SQLAlchemy |
| |
| |
| ===== Test et utlisation ===== | |
| | * Lignes 7 et 25 : les classes doivent hériter de db.Model pour que les objets puissent être enregistrés dans la base de données; |
| | * Pour chaque attribut, on définit un type valide pour le stockage en base de données; |
| | |
| | ===== La relation one-to-many ===== |
| | |
| | |
| | ==== L'option lazy="dynamic" de la méthode db.relationship ==== |
| | |
| | A la ligne 12, on peut voir que l'option **''lazy="dynamic"''** est utilisée pour définir la relation. |
| | |
| | Lorsque cette option est utilisée, l'attribut ''Shop.products'' **ne retourne plus directement la liste complète** de tous les produits désignés par la relation. Au lieu de cela, ''Shop.products'' retourne un objet de type requête : cela permet notamment de **définir des critères de sélection**. |
| | |
| | |
| | ===== Test et utilisation ===== |
| |
| Pour tester l'implémentation, on peut lancer l'application flask en mode interactif : | Pour tester l'implémentation, on peut lancer l'application flask en mode interactif : |
| <code python> | <code python> |
| >>> # Afficher les références | >>> # Afficher les références |
| | >>> dir() |
| |
| >>> # Création de la base | >>> # Création de la base |
| | >>> db.drop_all() |
| | >>> db.create_all() |
| |
| >>> # Instanciation d'un magasin et de quelques produits | >>> # Instanciation d'un magasin et de quelques produits |
| | >>> l = Shop() |
| | >>> l.name = "LouerMoi" |
| | >>> db.session.add(l) |
| | >>> db.session.commit() |
| |
| | >>> p = Product() |
| | >>> p.name = "Ponceuse Botch" |
| | >>> p.price = 59.90 |
| | >>> |
| | >>> t = Product() |
| | >>> t.name = "Tronconeuse Botch" |
| | >>> t.price = 169.99 |
| | >>> |
| | >>> l.add_product(p) |
| | >>> l.add_product(t) |
| |
| | >>> # Récupère tous les produits du magasin |
| | >>> l.products.all() |
| |
| >>> # Ne récupérer que les produits dont le prix est supérieur à 30€ | >>> # Ne récupérer que les produits dont le prix est supérieur à 60€ |
| >>> rqt.filter(Product.price>30.0).all() | >>> l.products.filter(Product.price > 60.0).all() |
| |
| >>> # Utilisation de la fonction LIKE | >>> # Utilisation de la fonction LIKE |
| >>> rqt.filter(Product.name.like('%Ri%')).all() | >>> l.products.filter(Product.name.like('%pon%')).all() |
| </code> | </code> |
| |
| |
| * [[https://pratapsharma.io/flask-sql-alchemy-one-to-many-relationship/|Mise en oeuvre d'une relation one-to-many avec Flask-SQLAlchemy]] | * [[https://pratapsharma.io/flask-sql-alchemy-one-to-many-relationship/|Mise en oeuvre d'une relation one-to-many avec Flask-SQLAlchemy]] |
| | * [[https://www.digitalocean.com/community/tutorials/how-to-use-one-to-many-database-relationships-with-flask-sqlalchemy|La relation one-to-many avec Flask-SQLAlchemy (digitalocean.com)]] |
| | * https://www.geeksforgeeks.org/python/sqlalchemy-cascading-deletes/ |
| | * [[https://www.peterspython.com/fr/blog/sqlalchemy-utilisation-de-cascade-deletes-pour-supprimer-des-objets-connexes|Cascader la suppression des objets enfants (peterspython.com)]] |