ITEEK株式会社のロゴ

ITEEK

ブログ

Blogs

PythonにおけるORMは何がいい?(PyCon JP 2024)

2025-03-24

PythonにおけるORMは何がいい?(PyCon JP 2024)

導入

ORMは中規模以上のアプリケーション開発において避けられない技術です。

その主な理由は、リレーショナルデータモデルとオブジェクトデータモデル間の「インピーダンスミスマッチ」と呼ばれる本質的な差異にあります。

この問題により、生のSQLを使用したアプリケーション開発は規模が大きくなるにつれて非効率になります。


ORMに期待される主な機能には、データ型変換、型サポート、コネクションプーリング、トランザクション処理などがあります。

一方で、ドメインロジックとの融合や過度に直感的なインターフェースは必ずしも必要ではありません。


Pythonにおける主要なORM選択肢として、SQLAlchemy + AlembicとPrisma ORMが紹介されました。

SQLAlchemyは定番で多機能ですが、FastAPIとの相性に課題があります。

一方、Prisma ORMはPydanticとの統合が容易で、FastAPIとの相性が良いとされています。


インピーダンスミスマッチとは

オブジェクト指向プログラミングとリレーショナルデータベースは異なるデータモデルを持つ。

リレーショナルデータベースの関係モデルは整合性を重視した2次元表の構造を持っており、データ同士は関係(リレーション)によって表現される。

一方オブジェクト指向プログラミングのデータはひとまとまりのオブジェクトとして扱われ、関係モデルにおける関係と同じような構造を持つとすれば、オブジェクト指向としての恩恵が得られるモデル設計ができない。


SQLAlchemy + Alembicの簡単な使用例

まず、SQLAlchemyを使ってデータベースモデルを定義します。

例えば、Userテーブルを作成する場合


========================

from sqlalchemy import Column, Integer, String

from sqlalchemy.ext.declarative import declarative_base


Base = declarative_base()


class User(Base):

__tablename__ = 'users'

id = Column(Integer, primary_key=True)

name = Column(String(50), nullable=False)

========================


次に、Alembicを初期化し、マイグレーションスクリプトを生成します。


========================

alembic init alembic

alembic revision --autogenerate -m "Create users table"

========================


最後に、マイグレーションを実行してデータベースを更新します。


========================

alembic upgrade head

========================


これにより、モデルの変更を簡単にデータベースに反映できます。


Prisma ORMの簡単な使用例

まず、schema.prismaファイルでデータモデルを定義します。


========================

model User {

id Int @id @default(autoincrement())

email String @unique

name String?

posts Post[]

}


model Post {

id Int @id @default(autoincrement())

title String

content String?

published Boolean @default(false)

author User @relation(fields: [authorId], references: [id])

authorId Int

}

次に、Prisma Clientを使用してデータベース操作を行います。

import { PrismaClient } from '@prisma/client'


const prisma = new PrismaClient()


async function main() {

const user = await prisma.user.create({

data: {

name: 'Alice',

email: 'alice@example.com',

},

})

console.log(user)

}


main()

========================


このコードでは、新しいユーザーを作成し、結果を表示します。

Prisma ORMを使用することで、型安全性とコード補完が提供され、データベース操作が簡素化されます。


まとめ

ORMの使用にあたっては、その本質的な役割である「O/Rマッピング」に焦点を当てつつ、型サポートやDBマイグレーションなどの機能も重視すべきです。

また、開発するアプリケーションの要件や使用するフレームワークとの相性を考慮してORMは選択しないといけません。


中規模以上のアプリケーション開発においてはORMの使用が不可避であり、その選択と使用方法を慎重に検討することが重要となるため、アプリケーションを開発する際には、しっかり検討しましょう。

お問い合わせ

Contact

案件のご相談やお見積りなど、お気軽にご連絡ください。