0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

並行開発でPrismaスキーマ競合を回避する方法 - Vercel × Neon × GitHub環境での実践ガイド

Posted at

はじめに

チーム開発で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点を守れば防げます:

  1. mainマージ後は必ずprisma db push
  2. 開発開始時もprisma db push
  3. スキーマ変更はPRで明記

Vercel × Neon × GitHubの組み合わせは強力ですが、スキーマ同期は自動ではありません。チームで開発ルールを共有し、快適な開発環境を作りましょう!

参考リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?