


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)
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) ]
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)
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!

SlitingyPapyThonListIsDoneUsingTheSyntaxList [Démarrage: arrêt: étape] .He'showitworks: 1) startisheindexofthefirStelementoinclude.2) stopisTheIndexoftheFirstelementsoexclude.3) StepistheincrementBetweenselans.it'susefulfactingPortationSoListShsandCanusegeg

NumpyAllowsForvariousOperations ONARRAYS: 1) BasicarithmeticLikeaddition, Soustraction, Multiplication, anddivision; 2) AdvancedOperationSuchasmatrixMultiplication; 3) Element-Wiseoperations withoutExplicitloop

La syntaxe de base pour le découpage de la liste Python est la liste [Démarrage: arrêt: étape]. 1.Start est le premier index d'élément inclus, 2.STOP est le premier indice d'élément exclu et 3.StEP détermine la taille de l'étape entre les éléments. Les tranches sont non seulement utilisées pour extraire les données, mais aussi pour modifier et inverser les listes.

ListesoutPerformarRaySin: 1) dynamicingizingandfrequentinSertions / Deletions, 2) StoringheteroGeneousData, and3) MemoryEfficiencyForsparsedata, butmayhaveslightperformanceCostSincertorations.

Toconvertapythonarraytoalist, usethelist () Constructororageneratorexpression.1) ImportTheArrayModuleandCreateArray.2) Uselist (Arr) ou [Xforxinarr] à Convertittoalist, considérant la performance et le domaine de l'émie-efficacité pour les étages.

ChooseArraySoverListsInpyThonforBetterperformanceAndmemeMoryEfficacitéInSpecificScenarios.1) LargenumericalDatasets: ArraySreduceDeMemoryUsage.2)

Dans Python, vous pouvez utiliser pour les boucles, énumérer et les compréhensions de liste pour traverser les listes; En Java, vous pouvez utiliser des boucles traditionnelles et améliorées pour les boucles pour traverser les tableaux. 1. Les méthodes de traversée de la liste Python incluent: pour la compréhension de la boucle, de l'énumération et de la liste. 2. Les méthodes de traversée du tableau Java comprennent: traditionnel pour la boucle et amélioré pour la boucle.

L'article traite de la nouvelle instruction "Match" de Python introduite dans la version 3.10, qui constitue un équivalent pour les instructions de commutation dans d'autres langues. Il améliore la lisibilité du code et offre des avantages de performance par rapport aux if-elif-el traditionnels


Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Adaptateur de serveur SAP NetWeaver pour Eclipse
Intégrez Eclipse au serveur d'applications SAP NetWeaver.

SublimeText3 version anglaise
Recommandé : version Win, prend en charge les invites de code !

mPDF
mPDF est une bibliothèque PHP qui peut générer des fichiers PDF à partir de HTML encodé en UTF-8. L'auteur original, Ian Back, a écrit mPDF pour générer des fichiers PDF « à la volée » depuis son site Web et gérer différentes langues. Il est plus lent et produit des fichiers plus volumineux lors de l'utilisation de polices Unicode que les scripts originaux comme HTML2FPDF, mais prend en charge les styles CSS, etc. et présente de nombreuses améliorations. Prend en charge presque toutes les langues, y compris RTL (arabe et hébreu) et CJK (chinois, japonais et coréen). Prend en charge les éléments imbriqués au niveau du bloc (tels que P, DIV),

ZendStudio 13.5.1 Mac
Puissant environnement de développement intégré PHP
