ORM と向き合う
導入
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の使用が不可避であり、その選択と使用方法を慎重に検討することが重要となるため、アプリケーションを開発する際には、しっかり検討しましょう。