ホームページ >バックエンド開発 >Python チュートリアル >SQLModelを使用してPythonでアクティブレコードパターンを実装します

SQLModelを使用してPythonでアクティブレコードパターンを実装します

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-27 00:12:09464ブラウズ

Implementing the Active Record Pattern in Python with SQLModel

Python開発者は、Ruby on RailsからPythonへのアクティブレコードのエレガントなデータベースインタラクションをしばしば見逃します。 PythonのSQLalchemy(およびSQLModel)はデフォルトで異なる方法を使用していますが、PythonアプリケーションにRailsスタイルモデルの利便性をPythonに導入し、PythonのタイプとPythonのベストプラクティスを維持しながら、同様のモデルを実装できます。

アクティブレコードモード

アクティブレコードモード(Ruby on Railsによって宣伝)は、データベースレコードをデータベース操作方法を持つオブジェクトと見なしています。個別のリポジトリまたはデータアクセスオブジェクト(DAO)を使用する必要はなく、モデル自体はデータベースと対話する方法を知っています。

たとえば、

Railsでは、これを書くことができます:

<code class="language-ruby"># 查找记录
user = User.find(123)

# 更新记录
user.name = "New Name"
user.save

# 创建新记录
post = Post.create(title: "Hello World")</code>
pythonでsqlmodelを使用して

を実装します

PythonのSQLModelはこのモデルを直接提供していませんが、これらの一般的に使用される操作を提供するベースクラスを使用して実装できます。この方法は次のとおりです。

CRUDベースのモデル
  1. まず、一般的に使用されるCRUD操作を実装する基本クラスを作成します。

モデルでこのモードを使用します
<code class="language-python">from typing import TypeVar, List, Optional, Tuple
from datetime import datetime
import uuid
from sqlmodel import SQLModel, Session, select
from sqlalchemy import func

T = TypeVar("T", bound="CRUDModel")

class CRUDModel(SQLModel):
    id: str = Field(
        default_factory=lambda: str(uuid.uuid4()),
        primary_key=True
    )
    created_at: datetime = Field(default_factory=datetime.utcnow)
    updated_at: datetime = Field(default_factory=datetime.utcnow)

    @classmethod
    def all(cls: type[T], session: Session) -> List[T]:
        statement = select(cls)
        return session.exec(statement).all()

    @classmethod
    def find(cls: type[T], session: Session, id: str) -> Optional[T]:
        statement = select(cls).where(cls.id == id)
        return session.exec(statement).first()

    @classmethod
    def create(cls: type[T], session: Session, **kwargs) -> T:
        db_obj = cls(**kwargs)
        session.add(db_obj)
        session.commit()
        session.refresh(db_obj)
        return db_obj

    def update(self: T, session: Session, **kwargs) -> T:
        kwargs['updated_at'] = datetime.utcnow()
        for key, value in kwargs.items():
            setattr(self, key, value)
        session.add(self)
        session.commit()
        session.refresh(self)
        return self

    def delete(self: T, session: Session) -> None:
        session.delete(self)
        session.commit()

    @classmethod
    def paginate(
        cls: type[T],
        session: Session,
        page: int = 1,
        per_page: int = 20
    ) -> Tuple[List[T], int]:
        statement = select(cls)
        total = session.exec(select(func.count()).select_from(statement)).one()

        offset = (page - 1) * per_page
        results = session.exec(
            statement.offset(offset).limit(per_page)
        ).all()

        return results, total</code>
  1. 良いクラスクラスを定義した後、それを継承するモデルを作成できます:

モデルを使用します
<code class="language-python">class Article(CRUDModel, table=True):
    title: str = Field(..., description="Article title")
    content: str = Field(..., description="Article content")
    status: str = Field(default="draft")

    # Relationships
    comments: List["Comment"] = Relationship(
        back_populates="article",
        sa_relationship_kwargs={"cascade": "all, delete-orphan"}
    )</code>
    ここで、Pythonの明示的なセッション管理を維持しながら、Railsなどのモデルを使用してモデルを使用できます。
  1. railsの主な違い

このモデルはPythonの便利さをRailsに似ていますが、いくつかの重要な違いに注意を払う必要があります。

<code class="language-python">from db.session import get_session

# 列出所有文章
with get_session() as session:
    articles = Article.all(session)

# 查找特定文章
with get_session() as session:
    article = Article.find(session, "some-uuid")
    if article:
        print(f"Found: {article.title}")

# 创建新文章
with get_session() as session:
    article = Article.create(
        session,
        title="My New Article",
        content="Some content here"
    )

# 更新文章
with get_session() as session:
    article = Article.find(session, "some-uuid")
    if article:
        updated = article.update(
            session,
            title="Updated Title",
            content="New content"
        )

# 删除文章
with get_session() as session:
    article = Article.find(session, "some-uuid")
    if article:
        article.delete(session)

# 分页
with get_session() as session:
    articles, total = Article.paginate(session, page=2, per_page=10)</code>
微分トーク管理

:Pythonを管理する必要があります。これは、データベーストランザクションをよりよく理解するのに役立ちます。

  1. 安全:: Pythonタイプのプロンプトは、より良いIDEサポートを提供し、早期にエラーをキャプチャできます。
<code class="language-python"># 使用SQLModel的Python
with get_session() as session:
    article = Article.create(session, title="Hello")

# 与Rails对比
article = Article.create(title: "Hello")</code>
    クラスメソッド
  1. :Pythonは、明示的なデコレータを使用して、インスタンスなしで操作を処理します。
  2. エラー治療
:Pythonは明示的な異常な治療を奨励しています:
<code class="language-python">class Article(CRUDModel, table=True):
    title: str  # 类型安全!
    views: int = Field(default=0)</code>
  1. ベストプラクティス @classmethod Pythonでこのモードを使用する場合、次のベストプラクティスを覚えておいてください。
  2. 常にコンテキストマネージャーを使用してください
<code class="language-python">with get_session() as session:
    try:
        article = Article.find(session, "non-existent")
        if article is None:
            raise HTTPException(status_code=404, detail="Article not found")
    except Exception as e:
        # 处理其他数据库错误
        raise HTTPException(status_code=500, detail=str(e))</code>

タイプセキュリティ

  1. 検証
<code class="language-python">   # 正确的做法
   with get_session() as session:
       article = Article.create(session, title="Hello")

   # 不正确的方法
   session = get_session()
   article = Article.create(session, title="Hello")
   session.close()</code>
  1. 関係管理
<code class="language-python">   # 使用正确的类型提示
   def get_article(id: str) -> Optional[Article]:
       with get_session() as session:
           return Article.find(session, id)</code>
結論
    アクティブレコードモードは、タイプセキュリティを維持し、Pythonのベストプラクティスに従っている間、Pythonで効果的に実装できます。 Railsよりも適切なセッション管理が必要ですが、同様の利便性を提供し、開発者にデータベース操作をより制御できます。
  1. このモデルは、特に次のように適しています
    • Rails から Python に移行したチーム
    • モデル中心のデータベース操作を好む項目
    • 型安全性と明示的なセッション管理が重要なアプリケーション

    これは Python でデータベース操作を行う方法の 1 つにすぎないことを覚えておいてください。 SQLModel と SQLAlchemy は、リポジトリやデータ アクセス オブジェクトなど、特定の使用例により適した他のモードをサポートします。

    リソース

    • SQLModel ドキュメント
    • SQLModel を使用した FastAPI
    • SQLAlchemy ドキュメント
    • Python での入力ヒント

以上がSQLModelを使用してPythonでアクティブレコードパターンを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。