建立可擴展且可維護的模型通常需要模組化方法,特別是在跨多個模型處理共享行為或公共列類型時。在本部落格中,我們將介紹如何使用 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中文網其他相關文章!

使用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)注意內存使用,確保代碼清晰高效。

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

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

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

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中元組理解的不可能。建議使用tuple()與發電機表達式使用tuple()有效地創建元組。 (159個字符)

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

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


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

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

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

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

Dreamweaver Mac版
視覺化網頁開發工具

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能