ARTICLE

マルチORM環境のDBマイグレーション管理|Prisma+Alembic共存から一本化への移行・DDLガード・スキーマ不整合の復旧ガイド【2026年版】

2026/9/16 (更新: 2026/9/1)

SHARE

マルチORM環境のDBマイグレーション管理。Prisma+Alembic共存から一本化への移行ガイド【2026年版】

マル

マルチORM環境のDBマイグレーション管理|Prisma+Alembic共存から一本化への移行・DDLガード・スキーマ不整合の復旧ガイド【2026年版】

ARTICLE株式会社renue
renue

株式会社renue

2026/9/16 公開2026/9/1 更新

AI導入・DXの悩みをプロに相談してみませんか?

AIやDXに関する悩みがありましたら、お気軽にrenueの無料相談をご利用ください。 renueのAI支援実績、コンサルティングの方針や進め方をご紹介します。

FEとBEが同じDBを触る——マイグレーション衝突の悪夢

Next.js(Prisma)とFastAPI(Alembic/SQLAlchemy)が同じMySQLデータベースを共有する。この構成は珍しくありませんが、両方のORMがDDL(Data Definition Language)を発行すると、スキーマ不整合という深刻な問題が発生します。

実際に、FEコンテナを差し替えた直後にPrismaマイグレーションが走り、AlembicのDDLと衝突してテーブル定義が壊れ、コア機能が停止した事例が報告されています。画面表示は正常なのにバックエンド処理がエラーになる——最も発見が遅れるタイプの障害です。

本記事では、マルチORM環境でのDBマイグレーション管理の実践手法を、DDL管理の一本化からCIガード設計まで解説します。

なぜ問題が起きるのか——マルチORM環境の構造的リスク

典型的な構成

FE(Next.js)                BE(FastAPI)
  └ Prisma ORM                └ SQLAlchemy + Alembic
    └ prisma migrate            └ alembic upgrade head
      ↓                          ↓
   ┌──────────────────────────────┐
   │      同一MySQL DB           │
   │  ・FE管理テーブル            │
   │  ・BE管理テーブル            │
   │  ・共有テーブル              │
   └──────────────────────────────┘

衝突が発生する3つのパターン

パターン発生条件症状
テーブル重複作成両方のORMが同名テーブルを作成しようとするTable already existsエラー
カラム定義の不一致Prismaの更新日時カラム(アプリ側自動設定)とAlembicのINSERT文の間でデフォルト値が不整合INSERT時にNOT NULLエラー
マイグレーション未適用FEコンテナ差し替え時にPrismaマイグレーションが実行されないTable does not existエラー

解決策:DDL管理の一本化

最も根本的な解決策は、DDL管理を1つのORM(通常はバックエンド側)に一本化することです。

一本化の方針

  • DDL発行はAlembic(BE)のみ:テーブルの作成・変更・削除はAlembicだけが行う
  • Prismaはクライアントとしてのみ使用:FE側のPrismaはDB操作(CRUD)のみを担当。マイグレーションは実行しない
  • スキーマ同期は手動:Alembic側でスキーマを変更したら、Prismaスキーマも手動で同期

Prismaマイグレーションの「封印」手順

Prismaのマイグレーション機能を無効化する具体的な手順は以下の通りです。

  1. マイグレーション定義ディレクトリを全削除:管理対象外とするORMのマイグレーション資産を取り除く
  2. package.jsonからprisma:migrateを削除prisma:generateprisma:studioは残す
  3. prisma/schema.prisma先頭にコメント追加:DDL管理ルール、スキーマ同期手順、禁止操作を明記
  4. .gitignoreにマイグレーション定義ディレクトリを追加:誤再作成・誤コミットを防止
  5. README/AGENTS.mdを更新:「DDLはBE(Alembic)管理。FE側でマイグレーションしない」方針を明記
  6. CIにDDLガードを追加:マイグレーション定義ディレクトリが存在したら失敗、package.jsonprisma:migrateが混入したら失敗

封印後も維持するもの

  • クライアントライブラリへの依存(既存のDB操作を維持)
  • DB接続情報を渡す環境変数
  • prisma:generateコマンド(型生成に必要)
  • prisma:studioコマンド(DB閲覧に便利)

スキーマ不整合からの復旧手順

パターン1:テーブルが存在しない場合

FEがORM経由で設定系テーブルを参照するが、テーブルが存在しないケースです。

エラー: 対象テーブルが現在のデータベースに存在しません
原因: Prismaマイグレーションが最新まで実行されていない

復旧手順

  1. DBバックアップを取得(mysqldump
  2. 検証環境に限り、未適用のマイグレーションを適用(本番でのDB全削除は行わない)
  3. Alembicのみでテーブルを再作成(alembic upgrade head
  4. FEコンテナを再起動してDB接続をリフレッシュ

パターン2:テーブルが既に存在する場合

Alembicが新しいテーブルを作成しようとするが、Prismaが既に作成済みのケースです。

エラー: Table '(対象テーブル)' already exists
原因: Prismaが作成したテーブルをAlembicが再作成しようとした

復旧手順

  1. alembic stamp headで「DBは既に最新状態」とAlembicに記録
  2. テーブル構造自体は変更しない
  3. 以後のマイグレーションはAlembicのみが管理

パターン3:カラム定義の不一致

Prisma側は更新日時カラムをアプリ側で自動設定する前提だが、Alembic側のINSERT文にその値が含まれていないケースです。

エラー: Column '(更新日時カラム)' cannot be null
原因: Prismaが作成したテーブル定義とAlembicのモデル定義でデフォルト値の扱いが異なる

復旧手順

  1. Alembicでマイグレーションファイルを作成し、server_defaultを追加
  2. alembic upgrade headで適用

CIガードの設計

DDL管理の一本化は、ルールだけでは守れません。CIパイプラインでの自動チェックが必須です。

チェック項目

チェック失敗条件目的
Prisma migrations検知マイグレーション定義ディレクトリディレクトリが存在する封印後の誤再作成を防止
migrate コマンド検知package.jsonprisma:migrateが含まれる封印後の誤混入を防止
Alembic整合性チェックマイグレーション履歴とDBのalembic_versionが不一致マイグレーション漏れを検出

マイグレーション冪等性の確保

Alembicマイグレーションは冪等(何回実行しても同じ結果になる)である必要があります。特にマルチORM環境では、テーブルが既に存在する状態でマイグレーションが実行されるケースが頻発します。

冪等性の実装パターン

  • IF NOT EXISTS:テーブル作成時に既存チェックを含める
  • try-except:テーブル存在エラーをキャッチして無視
  • 条件分岐alembic_versionテーブルの状態に応じて処理を分岐

2026年のマイグレーション管理トレンド

ORMの隠れた偏見

Alembic、Django Migrations、Prisma Migrateなどのマイグレーションツールには「隠れた偏見」があることが指摘されています。ORMはデータベースの抽象化に焦点を当てており、データベース管理そのものには向いていません。

高度なデータベース機能、CI/CD統合、複数スタック間の一貫性が必要なチームには、AtlasのようなORM非依存のスキーマ管理ツールが選択肢になります。

Prismaの外部管理テーブル機能

Prismaはtables.external設定で、他チーム・他サービスが管理するテーブルを「外部管理」とマークできます。これにより、Prismaがそのテーブルのマイグレーションを発行しなくなります。

実務でのベストプラクティス

DDL管理の一本化ルール

  1. 1プロジェクト1マイグレーションツール:DDLを発行するのは1つだけ
  2. ORM間の境界を明確に:どのORMがどのテーブルを「所有」するかを文書化
  3. CIで強制:ルール違反を自動検出してマージをブロック
  4. 環境再構築手順を文書化DROP → CREATE → migrateの完全手順

デプロイ時の注意点

  • マイグレーション前に必ずDBバックアップを取得する
  • コンテナ再起動時にマイグレーションが自動実行されないか確認する(DockerfileのCMDにmigrate含まれていないか)
  • ロールバック手順を事前に用意する(alembic downgrade、バックアップからの復元)

まとめ:マルチORM環境のマイグレーション管理チェックリスト

フェーズチェック項目完了基準
設計DDL管理ツールが1つに統一されているかドキュメントで明文化済み
封印不要なマイグレーション機能が無効化されているかmigrations/削除、CIガード設定
CI封印違反の自動検出が設定されているかPRで自動ブロック
冪等性マイグレーションが冪等に設計されているか2回実行してもエラーなし
デプロイマイグレーション前にDBバックアップを取得しているかバックアップファイル存在確認
復旧スキーマ不整合の復旧手順が文書化されているか3パターンの復旧手順が存在

マルチORM環境でのDBマイグレーション管理は、「ルールを決める」だけでは不十分です。CIで強制し、復旧手順を文書化し、デプロイ時にバックアップを取得する——この3層の防御が、スキーマ不整合という悪夢を防ぎます。

あわせて読みたい

AI活用のご相談はrenueへ

renueは自社開発のAIツールを自社運用する「自社実証型」AIコンサルティングファームです。

→ AIコンサルティングの詳細を見る

関連記事

開発プロセスの改善はrenueにご相談ください

SHARE

FAQ

よくある質問

Next.js(Prisma)とFastAPI(Alembic/SQLAlchemy)が同じDBを操作する環境で、マイグレーションが衝突しスキーマ不整合が発生する問題です。FE側とBE側がそれぞれ独自にマイグレーションを生成するため、テーブル定義の矛盾やカラムの二重追加が起きます。

マイグレーション管理をAlembic(またはPrisma)に一本化し、もう一方はスキーマの読み取り専用にする設計が推奨です。DDLガード(マイグレーション以外からのスキーマ変更を禁止するCI検知)を導入し、スキーマ不整合を自動検知する仕組みを構築します。

現在のDB状態のダンプ→期待スキーマとの差分比較(schemadiff等)→差分を修正するマイグレーション手動作成→テスト環境で検証→本番適用のステップです。本番DBへの直接ALTER文実行は最終手段とし、必ずマイグレーションファイルとして記録します。

主に、本番DBへの直接ALTER文実行を禁止する権限設計、CIでマイグレーションファイル以外のDDLを検知、本番DBスキーマと期待スキーマの差分を週次/日次で監視、差分発生時の自動アラート、レビュー必須化、Prisma側はprisma db pull(読み取り専用)で同期、SQLAlchemyのreflect機能で型を自動取得、です。DDLガードはマイグレーションを唯一のスキーマ変更経路として運用するための仕組みで、長期的な品質維持の鍵となります。

主に、マイグレーション一本化のオーナーシップ、CI/CDでのマイグレーション自動適用と検証、ステージング→本番の段階デプロイ、ロールバック手順とバックアップ、機密データの取扱、モノレポ構成での共通スキーマ定義、コード生成(Prisma Client / SQLAlchemyモデル)の自動同期、テスト戦略(マイグレーション単体・統合)、観測性(スキーマ変更ログ)、AI支援(PRの差分要約・影響範囲解析)、です。複数ORM環境はトラブルが発生しやすく、運用ルールと自動化の徹底が、長期的な開発生産性とデータ整合性の本質的な要素となります。

AI導入・DXの悩みをプロに相談してみませんか?

AIやDXに関する悩みがありましたら、お気軽にrenueの無料相談をご利用ください。 renueのAI支援実績、コンサルティングの方針や進め方をご紹介します。

関連記事

AI導入・DXの悩みをプロに相談してみませんか?

AIやDXに関する悩みがありましたら、お気軽にrenueの無料相談をご利用ください。renueのAI支援実績、コンサルティングの方針や進め方をご紹介します。

無料資料をダウンロード