こんにちは、ナナオです。
ドメイン駆動開発しているとデータモデルを作る機会は多いと思いますが、Pythonではどのようにデータモデルを表現すればいいのか、というところを軽くまとめました。
とりあえず使うなら -> dataclasses
個人開発などでとりあえずデータモデルを定義したいだけならdataclassで事足りると思います。
dataclasses --- データクラス — Python 3.13.11 ドキュメント
import uuid
from dataclasses import dataclass
@dataclass
class User:
id: uuid.UUID
name: str
# 使い方
user = User(
id=uuid.uuid4(),
name="nanao",
)
なんといっても標準ライブラリで、かつ使いやすいのが特徴ですね。
特にDB連携なんかもしないならこれでいいと思います。
データベースと連携するなら -> SQLAlchemy
DB連携を考えるなら外せないのがSQLAlchemyですね。
SQLAlchemy - The Database Toolkit for Python
from typing import List
from typing import Optional
from sqlalchemy import ForeignKey
from sqlalchemy import String
from sqlalchemy.orm import DeclarativeBase
from sqlalchemy.orm import Mapped
from sqlalchemy.orm import mapped_column
from sqlalchemy.orm import relationship
class Base(DeclarativeBase):
pass
class User(Base):
__tablename__ = "user_account"
id: Mapped[int] = mapped_column(primary_key=True)
name: Mapped[str] = mapped_column(String(30))
本番利用も考えるなら -> pydantic
こちらのライブラリはバリデーションの豊富さなどの観点から、さながらdataclassesの進化版といったところでしょうか。
Welcome to Pydantic - Pydantic Validation
import uuid
from pydantic import BaseModel
class User(BaseModel):
id: uuid.UUID
name: str
user = User(
id=uuid.uuid4(),
name="nanao",
)
数値のバリデーション型がデフォルトで用意されていたり、かなり便利です。
SQLAlchemyのモデルと分離させたくないとき -> ormar
SQLAlchemyとpydanticを併用するというパターンがよくあるのですが、実際定義されるデータモデルはそれぞれ同じプロパティを定義しているだけだったりします。
ということで、そういった重複したプロパティ定義をしないで済むのがormarです。
pydanticのモデルバリデーションと、SQLAlchemyのORMとしての機能を融合したようなライブラリです。
GitHub - collerek/ormar: python async orm with fastapi in mind and pydantic validation
from typing import Optional
import uuid
import databases
import pydantic
import ormar
import sqlalchemy
DATABASE_URL = "sqlite:///db.sqlite"
base_ormar_config = ormar.OrmarConfig(
database=databases.Database(DATABASE_URL),
metadata=sqlalchemy.MetaData(),
engine=sqlalchemy.create_engine(DATABASE_URL),
)
class User(ormar.Model):
ormar_config = base_ormar_config.copy(tablename="user")
id: uuid.UUID = ormar.UUID(primary_key=True)
name: str = ormar.String(max_length=100)
まとめ
いくつかのデータモデル定義をまとめました。
(SQLAlchemyとormarは厳密にはORMですが)
うまく使って実装を効率化していきましょう。