OpenCodeでデータベース設計とマイグレーションを完全マスター
OpenCodeを使ったデータベース設計とマイグレーションの実践的なチュートリアル。Prismaを用いたスキーマ定義、マイグレーション実行、SQL管理までを解説。
はじめに
OpenCodeは、データベース設計とマイグレーションを効率的に行うための強力なツールです。本記事では、Prismaを活用したデータベース設計、マイグレーションの実行、SQLの管理方法を実践的に解説します。OpenCodeを利用することで、開発初期のデータベース設計から本番環境への適用まで、一貫したワークフローを構築できます。
OpenCodeとPrismaの連携
OpenCodeは、Prisma ORMとシームレスに連携します。PrismaはTypeScript/JavaScript向けの次世代ORMであり、データベーススキーマを宣言的に定義し、マイグレーションを自動生成します。OpenCode上でPrismaを使うことで、以下のようなメリットがあります。
データベース設計の基本
スキーマ定義
Prismaスキーマは、schema.prismaファイルに記述します。以下は、ブログアプリケーションの例です。
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
generator client {
provider = "prisma-client-js"
}
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
posts Post[]
createdAt DateTime @default(now())
}
model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
author User @relation(fields: [authorId], references: [id])
authorId Int
createdAt DateTime @default(now())
}
リレーションの設計
1対多のリレーションは、@relation属性で定義します。上記の例では、UserとPostが1対多の関係です。多対多の場合は、中間テーブルを明示的にモデルとして定義するか、@relationで自動生成させます。
model Category {
id Int @id @default(autoincrement())
name String @unique
posts Post[]
}
model Post {
id Int @id @default(autoincrement())
title String
categories Category[]
}
マイグレーションの実行
初期マイグレーション
スキーマ定義後、以下のコマンドで初期マイグレーションを作成します。
npx prisma migrate dev --name init
このコマンドは、スキーマからマイグレーションSQLファイルを生成し、データベースに適用します。同時にPrisma Clientも生成されます。
スキーマ変更時のマイグレーション
モデルにフィールドを追加する場合:
model User {
// 既存フィールド
profile String? // 追加
}
マイグレーションコマンド:
npx prisma migrate dev --name add-profile
マイグレーションのロールバック
Prismaでは、直接的なロールバックコマンドはありませんが、prisma migrate diffとprisma db executeを使って手動でロールバックできます。また、Gitなどのバージョン管理を使ってマイグレーションファイルを管理するのが一般的です。
SQLの管理と最適化
マイグレーションSQLの確認
生成されたマイグレーションSQLは、prisma/migrations/ディレクトリに保存されます。必要に応じて手動で編集することも可能です。
-- CreateTable
CREATE TABLE "User" (
"id" SERIAL NOT NULL,
"email" TEXT NOT NULL,
"name" TEXT,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "User_pkey" PRIMARY KEY ("id")
);
インデックスの追加
パフォーマンス向上のため、インデックスを追加します。
model Post {
id Int @id @default(autoincrement())
title String
content String?
published Boolean @default(false)
author User @relation(fields: [authorId], references: [id])
authorId Int
createdAt DateTime @default(now())
@@index([authorId, published])
}
生SQLの実行
Prisma Clientで生SQLを実行することも可能です。
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
const users = await prisma.$queryRawSELECT * FROM "User" WHERE "email" = ${email}
実践的なワークフロー
prisma migrate devでデータベース作成prisma migrate deployで本番環境に適用トラブルシューティング
マイグレーション競合
複数ブランチでスキーマ変更があった場合、prisma migrate devで競合が発生することがあります。その場合は、ベースブランチに戻ってマイグレーションをリセットするか、手動で解決します。
データ損失の防止
prisma migrate devは、データ損失を伴う変更(カラム削除など)を検出すると警告を出します。--create-onlyオプションを使い、SQLを確認してから適用することもできます。
まとめ
OpenCodeとPrismaを組み合わせることで、データベース設計からマイグレーションまでを効率的に行えます。型安全なスキーマ定義、自動マイグレーション、SQL管理機能を活用し、堅牢なデータベース基盤を構築しましょう。