はじめに
チーム開発でPrismaを使っていると、「さっきまで動いていたのに急にエラーが...」という経験はありませんか?
特に複数人が並行して開発している時、こんなエラーに遭遇することがあります:
The column `contents.wordCount` does not exist in the current database
今回は、この問題がなぜ起きるのか、どう回避するのかを初心者向けに解説します。
何が起きたのか?図で理解する
並行開発の流れ
具体的なタイムライン
時刻 10:00 - 両者が開発開始
├─ Aさん: 単語数機能を開発開始
└─ Bさん: フィルター機能を開発開始
時刻 14:00 - Aさんがスキーマ変更
└─ schema.prismaに wordCount を追加
時刻 16:00 - Aさんの変更がmainにマージ
└─ mainブランチのスキーマが更新される
時刻 17:00 - Bさんがmainをマージ
└─ コード: wordCountを期待 ✓
└─ DB: wordCountが存在しない ✗
└─ 結果: エラー!
なぜこのエラーが起きるのか?
Prismaの2つの世界
Prismaを使う時、2つの「世界」を理解する必要があります:
1. 設計図の世界(schema.prisma)
model Content {
id String @id
title String
wordCount Int? // ← Aさんが追加
}
2. 実物の世界(実際のデータベース)
-- 実際のテーブル構造
CREATE TABLE contents (
id TEXT PRIMARY KEY,
title TEXT
-- wordCount列はまだない!
);
同期が必要な理由
設計図(schema.prisma)を変更しても、実物(データベース)は自動で変わりません。手動で同期する必要があります:
# 設計図を実物に反映
prisma db push
解決方法:3つのアプローチ
1. 手動で同期する(シンプル)
mainブランチをマージした後、必ず実行:
# mainの変更を取り込む
git pull origin main
# スキーマを同期
npx prisma db push
# 開発再開
npm run dev
2. スクリプトで自動化(おすすめ)
package.jsonに便利なスクリプトを追加:
{
"scripts": {
"sync-main": "git pull origin main && prisma db push",
"dev": "prisma db push && next dev"
}
}
使い方:
# mainをマージして同期
npm run sync-main
# 開発開始(自動で同期)
npm run dev
3. CI/CDで完全自動化(上級)
Neonのブランチ機能を使った自動化:
// scripts/neon-branch-setup.js
const { execSync } = require('child_process');
async function setupNeonBranch() {
console.log('🚀 Neonブランチセットアップ開始...');
// Prismaクライアントの生成
execSync('prisma generate', { stdio: 'inherit' });
// データベーススキーマの同期
execSync('prisma db push --skip-generate', { stdio: 'inherit' });
console.log('✅ セットアップ完了!');
}
setupNeonBranch();
ローカル開発環境のベストプラクティス
よくある質問:ローカルでPostgreSQLは必要?
一般的な3つのパターン
1. ローカルPostgreSQL派(従来型)
# Docker Composeでローカルに立ち上げ
docker-compose up -d postgres
メリット:
- オフラインで開発可能
- 高速なレスポンス
- 本番に影響なし
デメリット:
- セットアップが面倒
- 本番との差異が生じやすい
2. Neon開発ブランチ派(モダン)
# 各開発者用のNeonブランチを使用
DATABASE_URL="postgresql://...@ep-dev-branch.neon.tech/..."
メリット:
- 本番と同じ環境
- セットアップ不要
- チーム間で共有しやすい
デメリット:
- インターネット必須
- 若干のレイテンシー
3. ハイブリッド派(バランス型)
# 通常はNeon、大量データテストはローカル
npm run dev # Neon使用
npm run dev:local # ローカルPostgreSQL使用
推奨される開発フロー
チーム開発のルール
1. スキーマ変更時のルール
## PR Description Template
### スキーマ変更
- [ ] schema.prismaを変更した
- [ ] 変更内容: `wordCount`, `characterCount`を追加
- [ ] マイグレーション方法: `prisma db push`
### 影響範囲
- 他の開発者は`npm run sync-main`の実行が必要
2. 毎日の開発開始時
# 朝一番に実行
git pull origin main
npm run dev # 自動でprisma db push
3. トラブルシューティング
エラーが出たら、まず確認:
# 1. 最新のmainを取得しているか
git log --oneline -5
# 2. スキーマが同期されているか
npx prisma db push
# 3. それでもダメなら
npx prisma generate
npm run dev
まとめ
並行開発でのスキーマ競合は、以下の3点を守れば防げます:
- mainマージ後は必ず
prisma db push
- 開発開始時も
prisma db push
- スキーマ変更はPRで明記
Vercel × Neon × GitHubの組み合わせは強力ですが、スキーマ同期は自動ではありません。チームで開発ルールを共有し、快適な開発環境を作りましょう!