首頁 > 後端開發 > Python教學 > 使用 Mixin 和註解模組化 SQLAlchemy 模型

使用 Mixin 和註解模組化 SQLAlchemy 模型

DDD
發布: 2025-01-04 20:08:43
原創
609 人瀏覽過

Modularizing SQLAlchemy Models with Mixins and Annotations
建立可擴展且可維護的模型通常需要模組化方法,特別是在跨多個模型處理共享行為或公共列類型時。在本部落格中,我們將介紹如何使用 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)
登入後複製
登入後複製
解釋
  • @declared_attr:確保屬性動態加入繼承模型中。
  • default 和 onupdate:自動設定建立和更新的時間戳記。

 

定義常用註解

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)
]
登入後複製
解釋
  • UUID 主鍵:uuid4pk 註解定義主鍵的通用唯一識別碼。
  • Name Column:名稱註解確保 String 列的最大長度為 30 個字符,且沒有 NULL 值。

 

使用 Mixin 和註解建立模型

使用混入和註釋,我們可以定義繼承共享行為和屬性的模型,同時保持實現簡潔和可讀。
 
檔: 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)
登入後複製
登入後複製
解釋
  • 聲明性基礎:基礎是所有 SQLAlchemy 模型的基礎。

 

這種方法的好處

1。 明確分離關注點

  • timestamp_mixin.py:包含可重複使用邏輯(例如時間戳記)。
  • common_annotations.py:定義公用列屬性(例如,UUID、字串)。
  • user.py:將這些構建塊組合成具體模型。

2。 易於維護

  • 如果需要更改時間戳的工作方式或更新列約束,只需修改timestamp_mixin.py或common_annotations.py檔案。這些變更會自動反映在所有依賴模型中。

3。 可擴充性

  • 隨著專案的發展,這種結構可以更輕鬆地添加新行為或欄位類型,而無需引入冗餘。

   

最後的想法

使用 SQLAlchemy 的 mixins註解模組化模型是處理共享功能和屬性的良好策略。這種方法不僅減少了重複,而且符合乾淨、可維護程式碼的最佳實踐。

以上是使用 Mixin 和註解模組化 SQLAlchemy 模型的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板