スケーラブルで保守可能なモデルを構築するには、特に複数のモデル間で共有される動作や共通の列タイプを処理する場合、モジュール型のアプローチが必要になることがよくあります。このブログでは、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)
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) ]
ミックスインとアノテーションを使用すると、実装を簡潔で読みやすく保ちながら、共有の動作とプロパティを継承するモデルを定義できます。
ファイル: 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 の ミックスイン と アノテーション を使用してモデルをモジュール化することは、共有機能とプロパティを処理するための優れた戦略です。このアプローチは重複を減らすだけでなく、クリーンで保守可能なコードのベスト プラクティスにも適合します。
以上がミックスインとアノテーションを使用した SQLAlchemy モデルのモジュール化の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。