Outils pour utilisateurs

Outils du site


dev:python:flask:flask-sqlalchemy:relation_agregation

Ceci est une ancienne révision du document !


:TODO_DOCUPDATE:

Flask-SQLAlchemy : Définir une relation d'agrégation

La relation d'agrégation est une forme particulière de relation one-to-many. C'est une composition sans appartenance : la suppression d'une instance de la classe regroupant les agrégats n'entraine pas la suppression des agrégats.

Un exemple de relation d'agrégation dans le diagramme UML ci-dessous :

Le symbole UML de l'agrégation Symbole UML de l'agrégation. On place le symbole du côté de la classe qui regroupe les agrégats.

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 un à plusieurs (one to many).

En définissant une association de type agréation, on fait le choix de conserver les colis dans notre base de données même si on supprime notre entrepôt.

MLD et contraintes

Pour pouvoir traduire cette relation d'agrégation il va falloir créer les contraintes appropriées lors de l'étape de traduction vers les MLD/MPD.

Ci-dessous une application minimale Flask définissant le modèle de données

  1. from flask import Flask
  2. from flask_sqlalchemy import SQLAlchemy
  3.  
  4. db = SQLAlchemy()
  5.  
  6.  
  7. class Warehouse(db.Model):
  8. __tablename__ = 'warehouse'
  9. id = db.Column(db.Integer, primary_key=True, index=True)
  10. name = db.Column(db.String(80), unique=True, index=True)
  11. # Association one-to-many
  12. packets = db.relationship("Packet", backref="warehouse")
  13.  
  14.  
  15.  
  16. class Packet(db.Model):
  17. __tablename__ = 'packet'
  18. id = db.Column(db.Integer, primary_key=True, index=True)
  19. sender = db.Column(db.String(80))
  20. recipient = db.Column(db.String(80))
  21. warehouse_id = db.Column(db.Integer, db.ForeignKey('warehouse.id'), unique=False, nullable=True)
  22.  
  23.  
  24.  
  25. # Création de l'application
  26. # On utilise la variable __name__ pour définir le nom du module courant
  27. # comme root applicatif pour notre application flask
  28. app = Flask(__name__)
  29.  
  30. # Le chemin vers la base SQLite est relatif au dossier de l'application flask
  31. app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///database.db"
  32.  
  33. # Initialiser l'application Flask par l'intermédiaire de l'extension
  34. db.init_app(app)

Références

dev/python/flask/flask-sqlalchemy/relation_agregation.1753191952.txt.gz · Dernière modification : 2025/07/22 13:45 de yoann