ホームページ > バックエンド開発 > Python チュートリアル > ミックスインとアノテーションを使用した SQLAlchemy モデルのモジュール化

ミックスインとアノテーションを使用した SQLAlchemy モデルのモジュール化

DDD
リリース: 2025-01-04 20:08:43
オリジナル
614 人が閲覧しました

Modularizing SQLAlchemy Models with Mixins and Annotations
スケーラブルで保守可能なモデルを構築するには、特に複数のモデル間で共有される動作や共通の列タイプを処理する場合、モジュール型のアプローチが必要になることがよくあります。このブログでは、SQLAlchemy の ミックスインアノテーション を使用してモデルをモジュール化する方法を説明します。
   

なぜモジュール化するのか?

プロジェクトで作業しているとき、created_at および updated_at タイムスタンプをモデルに追加したり、UUID 主キーなどの一般的な列タイプを定義したりするなど、反復的なタスクに頻繁に遭遇します。これらの懸念事項を個別のコンポーネントにモジュール化すると、いくつかの利点があります。
 
1. 再利用性: 共有された動作と列定義は複数のモデル間で使用できます。
2. 保守性: 1 か所での変更は、依存するすべてのモデルに反映されます。
3. 可読性: 関心事の明確な分離により、コードが理解しやすくなります。

タイムスタンプ ミックスイン の作成

ミックスインは、モデルに再利用可能なロジックまたはフィールドを提供します。 created_at フィールドと updated_at フィールドを継承するモデルに自動的に追加する TimestampMixin を定義しましょう。
 
ファイル: 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 の Annotated 型は、Python の testing.Annotated 経由で利用可能で、再利用可能な列プロパティを定義できます。たとえば、特定の制約を持つ UUID 主キーまたは String 列を定義できます。
 
ファイル: 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 アノテーションは、主キーの普遍的に一意な識別子を定義します。
  • 名前列: 名前注釈により、最大長が 30 文字で NULL 値がない String 列が確保されます。

ミックスインと注釈を使用したモデルの構築

ミックスインとアノテーションを使用すると、実装を簡潔で読みやすく保ちながら、共有の動作とプロパティを継承するモデルを定義できます。
 
ファイル: 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 の ミックスインアノテーション を使用してモデルをモジュール化することは、共有機能とプロパティを処理するための優れた戦略です。このアプローチは重複を減らすだけでなく、クリーンで保守可能なコードのベスト プラクティスにも適合します。

以上がミックスインとアノテーションを使用した SQLAlchemy モデルのモジュール化の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート