はじめに
「データベースの構造を変更したら、サービスがエラーで止まっちゃった!」
こんな経験はありませんか?今回は、この問題を初心者でも理解できるように解説します。
そもそも何が問題なの?
身近な例で考えてみよう
想像してください。あなたがレストランを経営していて、メニュー表を更新することにしました。
【旧メニュー】
- ハンバーグ定食
- カレーライス
- オムライス
【新メニュー】
- ハンバーグ定食
- カレーライス
- オムライス
- パスタセット(新規追加!)
でも、キッチンのスタッフには新メニューのことを伝えていません。お客さんが「パスタセット」を注文したら...?
スタッフ「そんなメニュー知りません!」→ エラー発生!
これと同じことがWebサービスでも起きるんです。
Webサービスで起きる問題
1. コードとデータベースの不一致
【プログラム】「新しいデータ(パスタセット)を保存して!」
【データベース】「そんな項目ないよ!」→ エラー!
2. タイミングのズレ
実際のWebサービスでは、こんな流れで問題が起きます:
1. 新機能のコードをアップロード
2. でも、データベースはまだ古いまま
3. ユーザーがアクセス → エラー!
解決方法1:手動でマイグレーション
マイグレーションって何?
マイグレーション = データベースの引っ越し作業
古い構造から新しい構造に、データを保ちながら変更することです。
手動実行の手順
1. まず状態を確認
# 今のデータベースの状態を確認
npx prisma migrate status
これで「まだ適用されていない変更」が見えます。
2. バックアップを取る(超重要!)
# データのバックアップ
npm run db:backup
失敗した時のために、必ずバックアップを!
3. マイグレーションを実行
# 本番環境のデータベースを更新
DATABASE_URL="本番データベースのURL" npx prisma migrate deploy
4. 確認
サービスにアクセスして、正常に動いているか確認します。
解決方法2:GitHub Actionsで自動化
自動化のメリット
- 忘れずに実行される
- 人為的ミスが減る
- 履歴が残る
設定方法
1. GitHubにシークレットを登録
1. GitHubのリポジトリを開く
2. Settings → Secrets → Actions
3. 「New repository secret」をクリック
4. Name: DATABASE_URL
5. Value: 本番データベースのURL
2. 自動実行ファイルを作成
.github/workflows/auto-migration.yml を作成:
name: 自動マイグレーション
on:
push:
branches: [main] # mainにマージされたら実行
jobs:
migrate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Node.jsをセットアップ
uses: actions/setup-node@v4
with:
node-version: '20'
- name: 依存関係をインストール
run: npm install
- name: マイグレーション実行
env:
DATABASE_URL: ${{ secrets.DATABASE_URL }}
run: |
echo "データベースを更新中..."
npx prisma migrate deploy
echo "完了!"
これで、コードをマージするだけで自動的にデータベースも更新されます!
より安全にする方法
段階的デプロイメント
一気に変更せず、段階的に進める方法です。
ステップ1:互換性のあるコードをデプロイ
// 新旧両方に対応するコード
function getMenuName(item) {
// 新しい名前があれば使う、なければ古い名前を使う
return item.newName || item.oldName;
}
ステップ2:データベースを更新
npm run migrate:production
ステップ3:古いコードを削除
// もう古い名前は使わない
function getMenuName(item) {
return item.newName;
}
チェックリスト
マイグレーション前の確認事項:
- バックアップは取った?
- テスト環境で試した?
- エラー時の対応方法は決めてる?
- ユーザーへの影響は最小限?
- 実行タイミングは適切?(深夜など)
トラブルシューティング
よくある問題と解決方法
1. 「Permission denied」エラー
# 権限がない場合は、正しいURLか確認
echo $DATABASE_URL
2. マイグレーションが失敗した
# 状態を確認
npx prisma migrate status
# 必要なら手動でSQLを実行
npx prisma db execute --file ./fix.sql
3. サービスが止まった
# すぐに前のバージョンに戻す
git revert HEAD
git push
まとめ
データベースの更新は慎重に行う必要がありますが、適切な手順を踏めば安全に実行できます。
重要なポイント:
- 必ずバックアップを取る
- テスト環境で試す
- 段階的に進める
- 自動化を活用する
最初は手動で慣れて、慣れたら自動化していきましょう!
参考リンク
質問があれば、コメント欄でお気軽にどうぞ!