Ci-dessous, les différences entre deux révisions de la page.
| Prochaine révision | Révision précédente | ||
| dev:python:flask:flask-sqlalchemy:relation_agregation [2025/07/22 10:05] – créée yoann | dev:python:flask:flask-sqlalchemy:relation_agregation [2025/07/22 15:31] (Version actuelle) – yoann | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| {{tag> | {{tag> | ||
| - | : | ||
| ====== Flask-SQLAlchemy : Définir une relation d' | ====== Flask-SQLAlchemy : Définir une relation d' | ||
| Ligne 15: | Ligne 14: | ||
| - | Un entrepôt (Warehouse) peut stocker plusieurs colis (Packet), et un colis est entreposé dans un seul entrepôt : cela définit bien une relation | + | Un entrepôt (Warehouse) peut stocker plusieurs colis (Packet), et un colis est entreposé dans un seul entrepôt : cela définit bien une association |
| - | En définissant une relation | + | En définissant une association |
| - | ===== MLD et contraintes ===== | + | ===== MLD et création des contraintes ===== |
| Pour pouvoir traduire cette relation d' | Pour pouvoir traduire cette relation d' | ||
| Ligne 27: | Ligne 26: | ||
| {{mld_relation_agregation.png}} | {{mld_relation_agregation.png}} | ||
| + | Le détail des règles de traduction des associations dans le MLD est abordé dans le cours [[cours: | ||
| - | Avec SQLAlchemy, il nous faudra définir la relation et un cascade update | ||
| - | Ci-dessous une application minimale Flask définissant | + | Ci-dessous une application minimale Flask mettant en œuvre |
| - | <code python> | + | <code python |
| + | from flask import Flask | ||
| + | from flask_sqlalchemy import SQLAlchemy | ||
| + | |||
| + | db = SQLAlchemy() | ||
| + | |||
| + | |||
| + | class Warehouse(db.Model): | ||
| + | __tablename__ = ' | ||
| + | id = db.Column(db.Integer, | ||
| + | name = db.Column(db.String(80), | ||
| + | |||
| + | |||
| + | class Packet(db.Model): | ||
| + | __tablename__ = ' | ||
| + | id = db.Column(db.Integer, | ||
| + | sender = db.Column(db.String(80)) | ||
| + | recipient = db.Column(db.String(80)) | ||
| + | warehouse_id = db.Column(db.Integer, | ||
| + | warehouse = db.relationship(" | ||
| + | |||
| + | |||
| + | app = Flask(__name__) | ||
| + | |||
| + | # Le chemin vers la base SQLite est relatif au dossier de l' | ||
| + | app.config[" | ||
| + | |||
| + | # Initialiser l' | ||
| + | db.init_app(app) | ||
| </ | </ | ||
| + | |||
| + | Deux point importants à relever : | ||
| + | * À la ligne 19 on **définit la clé étrangère** avec l' | ||
| + | * À la ligne 20 on définit l' | ||
| + | |||
| + | |||
| + | |||
| + | On peut tester rapidement le comportement du modèle avec la commande **flask shell** (mode interactif dans le contexte de l' | ||
| + | |||
| + | |||
| + | <code python> | ||
| + | >>> | ||
| + | >>> | ||
| + | >>> | ||
| + | >>> | ||
| + | >>> | ||
| + | >>> | ||
| + | >>> | ||
| + | >>> | ||
| + | >>> | ||
| + | >>> | ||
| + | >>> | ||
| + | >>> | ||
| + | >>> | ||
| + | >>> | ||
| + | >>> | ||
| + | >>> | ||
| + | >>> | ||
| + | >>> | ||
| + | >>> | ||
| + | ... | ||
| + | ... | ||
| + | <Packet 1 sender=Yoann recipient=Mariel> | ||
| + | <Packet 2 sender=Annie recipient=Nathalie> | ||
| + | <Packet 3 sender=Emilie recipient=Bastien> | ||
| + | >>> | ||
| + | >>> | ||
| + | >>> | ||
| + | >>> | ||
| + | >>> | ||
| + | >>> | ||
| + | >>> | ||
| + | >>> | ||
| + | >>> | ||
| + | None | ||
| + | </ | ||
| + | |||
| + | |||
| + | Pour automatiser les tests on pourra s’appuyer sur pytest | ||