ホームページ >バックエンド開発 >Python チュートリアル >SQLModelを使用してPythonでアクティブレコードパターンを実装します
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ベースのモデル
モデルでこのモードを使用します
<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>
モデルを使用します
<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に似ていますが、いくつかの重要な違いに注意を払う必要があります。
<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を管理する必要があります。これは、データベーストランザクションをよりよく理解するのに役立ちます。
<code class="language-python"># 使用SQLModel的Python with get_session() as session: article = Article.create(session, title="Hello") # 与Rails对比 article = Article.create(title: "Hello")</code>
<code class="language-python">class Article(CRUDModel, table=True): title: str # 类型安全! views: int = Field(default=0)</code>
@classmethod
Pythonでこのモードを使用する場合、次のベストプラクティスを覚えておいてください。
<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>
タイプセキュリティ
:
<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>
<code class="language-python"> # 使用正确的类型提示 def get_article(id: str) -> Optional[Article]: with get_session() as session: return Article.find(session, id)</code>結論
これは Python でデータベース操作を行う方法の 1 つにすぎないことを覚えておいてください。 SQLModel と SQLAlchemy は、リポジトリやデータ アクセス オブジェクトなど、特定の使用例により適した他のモードをサポートします。
リソース
以上がSQLModelを使用してPythonでアクティブレコードパターンを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。