La création de modèles évolutifs et maintenables nécessite souvent une approche modulaire, en particulier lors de la gestion de comportements partagés ou de types de colonnes communs à plusieurs modèles. Dans ce blog, nous expliquerons comment modulariser des modèles à l'aide des mixins et des annotations de SQLAlchemy.
Lorsque nous travaillons sur des projets, nous rencontrons fréquemment des tâches répétitives telles que l'ajout d'horodatages Create_at et Updated_at aux modèles ou la définition de types de colonnes courants comme les clés primaires UUID. La modularisation de ces préoccupations en composants distincts présente plusieurs avantages :
1. Réutilisabilité : les comportements partagés et les définitions de colonnes peuvent être utilisés sur plusieurs modèles.
2. Maintenabilité : les modifications centralisées se propagent à tous les modèles dépendants.
3. Lisibilité : Une séparation claire des préoccupations rend le code plus facile à comprendre.
Les Mixins fournissent une logique ou des champs réutilisables pour les modèles. Définissons un TimestampMixin qui ajoute automatiquement les champs Created_at et Updated_at à tout modèle qui en hérite.
Fichier : timestamp_mixin.py
from datetime import datetime from sqlalchemy import Column, DateTime from sqlalchemy.ext.declarative import declared_attr class TimestampMixin: @declared_attr def created_at(cls): return Column(DateTime, default=datetime.utcnow, nullable=False) @declared_attr def updated_at(cls): return Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)
Les types Annotés de SQLAlchemy, disponibles via le typage de Python.Annotés, vous permettent de définir des propriétés de colonnes réutilisables. Par exemple, vous pouvez définir une clé primaire UUID ou une colonne String avec des contraintes spécifiques.
Fichier :common_annotations.py
from typing import Annotated from uuid import uuid4 from sqlalchemy import String from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import mapped_column uuid4pk = mapped_column(UUID(as_uuid=True), primary_key=True, default=uuid4, nullable=False) ] name = Annotated[ str, mapped_column(String(30), nullable=False) ]
En utilisant les mixins et annotations, nous pouvons définir des modèles qui héritent d'un comportement et de propriétés partagés tout en gardant l'implémentation concise et lisible.
Fichier : user.py
from datetime import datetime from sqlalchemy import Column, DateTime from sqlalchemy.ext.declarative import declared_attr class TimestampMixin: @declared_attr def created_at(cls): return Column(DateTime, default=datetime.utcnow, nullable=False) @declared_attr def updated_at(cls): return Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)
1. Séparation claire des préoccupations
2. Facilité d'entretien
3. Évolutivité
La modularisation des modèles avec les mixins et les annotations de SQLAlchemy est une bonne stratégie pour gérer les fonctionnalités et les propriétés partagées. Cette approche réduit non seulement la duplication, mais s'aligne également sur les meilleures pratiques pour un code propre et maintenable.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!