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

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中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
如何使用numpy創建多維數組?如何使用numpy創建多維數組?Apr 29, 2025 am 12:27 AM

使用NumPy創建多維數組可以通過以下步驟實現:1)使用numpy.array()函數創建數組,例如np.array([[1,2,3],[4,5,6]])創建2D數組;2)使用np.zeros(),np.ones(),np.random.random()等函數創建特定值填充的數組;3)理解數組的shape和size屬性,確保子數組長度一致,避免錯誤;4)使用np.reshape()函數改變數組形狀;5)注意內存使用,確保代碼清晰高效。

說明Numpy陣列中'廣播”的概念。說明Numpy陣列中'廣播”的概念。Apr 29, 2025 am 12:23 AM

播放innumpyisamethodtoperformoperationsonArraySofDifferentsHapesbyAutapityallate AligningThem.itSimplifififiesCode,增強可讀性,和Boostsperformance.Shere'shore'showitworks:1)較小的ArraySaraySaraysAraySaraySaraySaraySarePaddedDedWiteWithOnestOmatchDimentions.2)

說明如何在列表,Array.Array和用於數據存儲的Numpy數組之間進行選擇。說明如何在列表,Array.Array和用於數據存儲的Numpy數組之間進行選擇。Apr 29, 2025 am 12:20 AM

forpythondataTastorage,choselistsforflexibilityWithMixedDatatypes,array.ArrayFormeMory-effficityHomogeneousnumericalData,andnumpyArraysForAdvancedNumericalComputing.listsareversareversareversareversArversatilebutlessEbutlesseftlesseftlesseftlessforefforefforefforefforefforefforefforefforefforlargenumerdataSets; arrayoffray.array.array.array.array.array.ersersamiddreddregro

舉一個場景的示例,其中使用Python列表比使用數組更合適。舉一個場景的示例,其中使用Python列表比使用數組更合適。Apr 29, 2025 am 12:17 AM

Pythonlistsarebetterthanarraysformanagingdiversedatatypes.1)Listscanholdelementsofdifferenttypes,2)theyaredynamic,allowingeasyadditionsandremovals,3)theyofferintuitiveoperationslikeslicing,but4)theyarelessmemory-efficientandslowerforlargedatasets.

您如何在Python數組中訪問元素?您如何在Python數組中訪問元素?Apr 29, 2025 am 12:11 AM

toAccesselementsInapyThonArray,useIndIndexing:my_array [2] accessEsthethEthErlement,returning.3.pythonosezero opitedEndexing.1)usepositiveandnegativeIndexing:my_list [0] fortefirstElment,fortefirstelement,my_list,my_list [-1] fornelast.2] forselast.2)

Python中有可能理解嗎?如果是,為什麼以及如果不是為什麼?Python中有可能理解嗎?如果是,為什麼以及如果不是為什麼?Apr 28, 2025 pm 04:34 PM

文章討論了由於語法歧義而導致的Python中元組理解的不可能。建議使用tuple()與發電機表達式使用tuple()有效地創建元組。 (159個字符)

Python中的模塊和包裝是什麼?Python中的模塊和包裝是什麼?Apr 28, 2025 pm 04:33 PM

本文解釋了Python中的模塊和包裝,它們的差異和用法。模塊是單個文件,而軟件包是帶有__init__.py文件的目錄,在層次上組織相關模塊。

Python中的Docstring是什麼?Python中的Docstring是什麼?Apr 28, 2025 pm 04:30 PM

文章討論了Python中的Docstrings,其用法和收益。主要問題:Docstrings對於代碼文檔和可訪問性的重要性。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能