建立可擴展且可維護的模型通常需要模組化方法,特別是在跨多個模型處理共享行為或公共列類型時。在本部落格中,我們將介紹如何使用 SQLAlchemy 的 mixins 和 註解.
模組化模型
在處理專案時,我們經常遇到重複性任務,例如在模型中加入created_at和updated_at時間戳記或定義常見的列類型(例如UUID主鍵)。將這些問題模組化為單獨的組件有幾個好處:
1. 可重複使用性:共享行為和列定義可以跨多個模型使用。
2. 可維護性:一個地方的變更會傳播到所有依賴模型。
3. 可讀性:清晰的關注點分離使程式碼更容易理解。
Mixin 為模型提供可重複使用的邏輯或欄位。讓我們定義一個 TimestampMixin,它會自動將created_at 和updated_at 欄位加入到繼承自它的任何模型中。
檔案: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)
SQLAlchemy 的註解類型,可透過 Python 的打字功能使用。附註釋,讓您定義可重複使用的列屬性。例如,您可以定義 UUID 主鍵或具有特定約束的字串列。
檔案: 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) ]
使用混入和註釋,我們可以定義繼承共享行為和屬性的模型,同時保持實現簡潔和可讀。
檔: 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。 明確分離關注點
2。 易於維護
3。 可擴充性
使用 SQLAlchemy 的 mixins 和 註解模組化模型是處理共享功能和屬性的良好策略。這種方法不僅減少了重複,而且符合乾淨、可維護程式碼的最佳實踐。
以上是使用 Mixin 和註解模組化 SQLAlchemy 模型的詳細內容。更多資訊請關注PHP中文網其他相關文章!