Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| dev:python:flask:flask-sqlalchemy:relation_agregation [2025/07/22 13:45] – 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 21: | Ligne 20: | ||
| - | ===== 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: | ||
| - | Ci-dessous une application minimale Flask définissant le modèle de données | ||
| - | <code python [enable_line_numbers=" | + | Ci-dessous une application minimale Flask mettant en œuvre le modèle de données. |
| + | |||
| + | <code python | ||
| from flask import Flask | from flask import Flask | ||
| from flask_sqlalchemy import SQLAlchemy | from flask_sqlalchemy import SQLAlchemy | ||
| + | |||
| db = SQLAlchemy() | db = SQLAlchemy() | ||
| - | + | ||
| + | |||
| class Warehouse(db.Model): | class Warehouse(db.Model): | ||
| __tablename__ = ' | __tablename__ = ' | ||
| id = db.Column(db.Integer, | id = db.Column(db.Integer, | ||
| name = db.Column(db.String(80), | name = db.Column(db.String(80), | ||
| - | # Association one-to-many | + | |
| - | packets = db.relationship(" | + | |
| - | + | ||
| + | |||
| class Packet(db.Model): | class Packet(db.Model): | ||
| __tablename__ = ' | __tablename__ = ' | ||
| Ligne 52: | Ligne 51: | ||
| recipient = db.Column(db.String(80)) | recipient = db.Column(db.String(80)) | ||
| warehouse_id = db.Column(db.Integer, | warehouse_id = db.Column(db.Integer, | ||
| + | warehouse = db.relationship(" | ||
| + | |||
| - | |||
| - | |||
| - | # Création de l' | ||
| - | # On utilise la variable __name__ pour définir le nom du module courant | ||
| - | # comme root applicatif pour notre application flask | ||
| app = Flask(__name__) | app = Flask(__name__) | ||
| + | |||
| # Le chemin vers la base SQLite est relatif au dossier de l' | # Le chemin vers la base SQLite est relatif au dossier de l' | ||
| app.config[" | app.config[" | ||
| + | |||
| # Initialiser l' | # Initialiser l' | ||
| db.init_app(app) | 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 | ||