serverpod-migrations について
serverpod-migrationsは、Serverpodのデータベース移行の作成、適用、修復を支援するスキルです。移行が必要なスキーマ変更と、生成された移行ファイルを安全に扱う方法を説明します。
主な機能
- 01移行が必要なスキーマ変更の判定
- 02Serverpod MCPでの移行作成と適用
- 03MCPが使えない場合のコマンドライン利用
- 04修復移行の作成と適用
- 05移行SQLの安全な編集方法の説明
活用シーン
- 01テーブルモデルやインデックスの変更の移行
- 02不整合が生じたデータベーススキーマの修復
- 03移行へのデータ変換処理の追加
MCP 対応
serverpod startの実行中にserverpod MCPが利用できる場合、create_migration、apply_migrations、修復移行ツールを使うよう案内します。MCPサーバーに接続できない場合は、コマンドラインを代替手段として示します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ serverpod/ serverpod --skill serverpod-migrationsインストール後、Claude Code で/serverpod-migrationsを入力して読み込まれたか確認します。
詳細
Serverpod のマイグレーション
Serverpod には、.spy.yaml で table が指定されたモデルの変更に対する SQL を生成するマイグレーションシステムがあります。マイグレーションは次の場合に適用されます。
serverpodMCP 経由でapply_migrationsツールが呼び出されたとき。通常は、開発中にserverpod startを実行している場合です。dart run bin/main.dart --apply-migrationsフラグを付けてサーバーを起動したとき。通常は、本番環境でサーバーを実行する場合です。
マイグレーションが必要な場合
.spy.yamlのtableモデルまたはフィールドを追加、削除、名前変更した場合。- 生成される外部キーに影響するリレーションフィールドを変更した場合。
- インデックスを追加、削除、変更した場合。
プロジェクトにデータベースが設定されていない場合(例:config/<runMode>.yaml に database セクションがない場合)、マイグレーションは必要ありません。
標準的な手順
serverpod start を実行している場合、マイグレーションの作成と適用は簡単になります。
serverpod start と MCP サーバーを実行している場合
serverpod start でサーバーを実行している場合は、serverpod MCP を使用して次の操作を行います。
create_migrationツールを使用してマイグレーションを作成します。apply_migrationsツールを使用してマイグレーションを適用します。
MCP サーバーが利用可能な場合は、必ず使用してください。
MCP サーバーへの接続に失敗した場合のみ
serverpod start でサーバーを実行していない場合は、CLI コマンドを使用して次の操作を行います。
serverpod generateを実行して、コードが生成されていることを確認します。serverpod create-migrationコマンドを使用してマイグレーションを作成します。
生成されたマイグレーションの編集
マイグレーションディレクトリには、migration.sql、definition.sql、および definition.json、definition_project.json、migration.json ファイルが含まれます。
作成後に migration.sql を手動で編集してもかまいません。よくある理由は次の 2 つです。
- データ変換を追加して、スキーマとともに既存の行も移行するため。
- 中間手順を経て同じ最終状態にすることで、破壊的な変更を非破壊的な変更にするため。たとえば、列を削除して作り直す代わりに、新しい列を追加し、古い列のデータを埋め戻してから、古い列を削除します。
ディレクトリ内のその他のファイルは編集しないでください。definition.sql は完全なスキーマであり、*.json ファイルは次回の serverpod create-migration で差分を取るために使用されるため、これらを変更すると、その後に作成されるすべてのマイグレーションが破損します。
マイグレーションの適用方法から、次の 2 つのルールが導かれます。
- マイグレーションがインストールされていないデータベースは、最新の
definition.sqlのみから作成され、migration.sqlは実行されません。既存のデータベースには、新しいmigration.sqlが順番に適用されます。そのため、編集したmigration.sqlの適用後のスキーマはdefinition.sqlと同一でなければならず、その中のデータ変換が影響するのは、そのバージョンを経由してアップグレードするデータベースのみです。 - すでに適用されたマイグレーションを編集しても、そのマイグレーションを適用済みのデータベースには反映されません。そのようなデータベースには、新しいマイグレーションを作成してください。
クライアント側(database: client または database: all が指定されたモデル)では、バージョンの migration.dart 内にあるマイグレーション SQL にも同じことが当てはまります。定義 SQL と JSON ファイルも同様に編集してはいけません。
修復マイグレーション
データベースが不整合な状態にある場合、修復マイグレーションによって整合性のある状態に戻します。ライブスキーマを読み取り、対象のマイグレーションバージョンと比較して差分を取ることで作成するため、データベースに接続できる必要があります。
serverpod start と MCP サーバーを実行している場合
create_repair_migrationツールを使用して修復マイグレーションを作成します。省略可能な引数はversion(対象のマイグレーションバージョン。既定値は最新)、tag、force(破壊的な変更がある場合、またはドリフトが検出されない場合に必要)です。apply_migrationsツールを使用して適用します。このツールは、サーバーを再起動せずに、保留中のマイグレーションと修復マイグレーションの両方を適用します。
MCP サーバーが利用可能な場合は、必ず使用してください。
MCP サーバーへの接続に失敗した場合のみ
# Use the `--mode` flag to specify the run mode
# Use the `--version` flag to specify the target version
# Use the `--force` flag to create a migration with destructive changes
# Use the `--tag` flag to name the migration
serverpod create-repair-migration [--mode production] [--version <name>] [--force] [--tag <tag>]
dart run bin/main.dart --apply-repair-migration を実行してサーバーを再起動し、修復マイグレーションを適用します。このコマンドを実行するようユーザーに依頼してください。