Maison > développement back-end > Tutoriel Python > Modularisation des modèles SQLAlchemy avec des mixins et des annotations

Modularisation des modèles SQLAlchemy avec des mixins et des annotations

DDD
Libérer: 2025-01-04 20:08:43
original
608 Les gens l'ont consulté

Modularizing SQLAlchemy Models with Mixins and Annotations
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.
   

Pourquoi modulariser ?

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.

 

Création d'un Timestamp Mixin

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)
Copier après la connexion
Copier après la connexion
Explication
  • @declared_attr : garantit que les attributs sont ajoutés dynamiquement aux modèles héritants.
  • par défaut et onupdate : définissez automatiquement les horodatages pour la création et les mises à jour.

 

Définir les Annotations communes

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)
]
Copier après la connexion
Explication
  • Clé primaire UUID : L'annotation uuid4pk définit un identifiant universellement unique pour les clés primaires.
  • Colonne de nom : L'annotation de nom garantit une colonne de chaîne d'une longueur maximale de 30 caractères et aucune valeur NULL.

 

Création de modèles avec des mixins et des annotations

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)
Copier après la connexion
Copier après la connexion
Explication
  • Base déclarative : La base sert de base à tous les modèles SQLAlchemy.

 

Avantages de cette approche

1. Séparation claire des préoccupations

  • timestamp_mixin.py : contient une logique réutilisable (par exemple, des horodatages).
  • common_annotations.py : définit les propriétés communes des colonnes (par exemple, UUID, chaînes).
  • user.py : combine ces éléments de base en modèles concrets.

2. Facilité d'entretien

  • S'il est nécessaire de modifier le fonctionnement des horodatages ou de mettre à jour les contraintes de colonne, il suffit de modifier les fichiers timestamp_mixin.py ou common_annotations.py. Les modifications sont automatiquement répercutées sur tous les modèles dépendants.

3. Évolutivité

  • À mesure que le projet grandit, cette structure facilite l'ajout de nouveaux comportements ou types de champs sans introduire de redondance.

   

Pensées finales

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!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal