こんにちは、ナナオです。

ドメイン駆動開発しているとデータモデルを作る機会は多いと思いますが、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ですが)

うまく使って実装を効率化していきましょう。