マイグレーション¶
マイグレーションは、データベースのバージョン管理システムのようなものです。各マイグレーションは、データベースへの変更とその取り消し方法を定義します。マイグレーションを通じてデータベースを変更することで、時間の経過とともにデータベースを進化させる一貫性のある、テスト可能で、共有可能な方法を作成します。
// マイグレーションの例
struct MyMigration: Migration {
func prepare(on database: Database) -> EventLoopFuture<Void> {
// データベースに変更を加える
}
func revert(on database: Database) -> EventLoopFuture<Void> {
// `prepare`で行った変更を取り消す(可能な場合)
}
}
async
/await
を使用している場合は、AsyncMigration
プロトコルを実装する必要があります:
struct MyMigration: AsyncMigration {
func prepare(on database: Database) async throws {
// データベースに変更を加える
}
func revert(on database: Database) async throws {
// `prepare`で行った変更を取り消す(可能な場合)
}
}
prepare
メソッドは、提供されたDatabase
に変更を加える場所です。これらは、テーブルやコレクション、フィールド、制約の追加や削除などのデータベーススキーマへの変更である可能性があります。また、新しいモデルインスタンスの作成、フィールド値の更新、クリーンアップなど、データベースの内容を変更することもできます。
revert
メソッドは、可能であればこれらの変更を元に戻す場所です。マイグレーションを元に戻せることで、プロトタイピングとテストが容易になります。また、本番環境へのデプロイが計画通りに進まなかった場合のバックアッププランも提供します。
登録¶
マイグレーションはapp.migrations
を使用してアプリケーションに登録されます。
import Fluent
import Vapor
app.migrations.add(MyMigration())
to
パラメータを使用して特定のデータベースにマイグレーションを追加できます。それ以外の場合は、デフォルトのデータベースが使用されます。
app.migrations.add(MyMigration(), to: .myDatabase)
マイグレーションは依存関係の順序でリストする必要があります。例えば、MigrationB
がMigrationA
に依存している場合、app.migrations
に2番目に追加する必要があります。
マイグレート¶
データベースをマイグレートするには、migrate
コマンドを実行します。
swift run App migrate
このコマンドはXcodeから実行することもできます。migrateコマンドは、最後に実行されてから新しいマイグレーションが登録されているかデータベースをチェックします。新しいマイグレーションがある場合は、実行前に確認を求めます。
リバート¶
データベースのマイグレーションを元に戻すには、--revert
フラグを付けてmigrate
を実行します。
swift run App migrate --revert
このコマンドは、最後に実行されたマイグレーションのバッチをデータベースでチェックし、それらを元に戻す前に確認を求めます。
自動マイグレート¶
他のコマンドを実行する前にマイグレーションを自動的に実行したい場合は、--auto-migrate
フラグを渡すことができます。
swift run App serve --auto-migrate
プログラムで実行することもできます。
try app.autoMigrate().wait()
// または
try await app.autoMigrate()
これらのオプションは両方ともリバートにも存在します:--auto-revert
とapp.autoRevert()
。