マイグレーション
マイグレーションは、データベーススキーマの変更を構造化され整理された方法で行うための仕組みです。マイグレーションはディレクトリ内に TypeScript ファイルとして保存され、コマンドラインツールを使用して実行できます。
Deepkit Framework を使用している場合、Deepkit ORM のマイグレーションはデフォルトで有効になっています。
コマンド
migration:create- データベースの差分に基づいて新しいマイグレーションファイルを生成しますmigration:pending- 保留中のマイグレーションファイルを表示しますmigration:up- 保留中のマイグレーションファイルを実行します。migration:down- down マイグレーションを実行し、古いマイグレーションファイルを元に戻します
これらのコマンドは、FrameworkModule をインポートした場合はアプリケーション内で、または @deepkit/sql の deepkit-sql コマンドラインツールを介して利用できます。
FrameworkModule のマイグレーション統合は、データベースを自動的に読み込みます(データベースは provider として定義する必要があります)。一方、deepkit-sql では、データベースをエクスポートしている TypeScript ファイルを指定する必要があります。後者は、Deepkit Framework を使わずに Deepkit ORM をスタンドアロンで使用する場合に便利です。
マイグレーションの作成
//database.ts import { Database } from '@deepkit/orm'; import { SQLiteDatabaseAdapter } from '@deepkit/sqlite'; import { User } from './models'; export class SQLiteDatabase extends Database { name = 'default'; constructor() { super(new SQLiteDatabaseAdapter('/tmp/myapp.sqlite'), [User]); } } export const database = new SQLiteDatabase();
./node_modules/.bin/deepkit-sql migration:create --path database.ts --migrationDir src/migrations
--path には Database インスタンスをエクスポートしているファイルを指定します(複数回指定できます)。エンティティが実行時の型情報を取得できるように、TypeScript ファイルは ts-node で読み込まれるため、ts-node をインストールしておく必要があります。
新しいマイグレーションファイルが src/migrations に作成されます。
新しく作成されたマイグレーションファイルには、TypeScript アプリで定義されたエンティティと設定されたデータベースとの差分に基づいた up メソッドと down メソッドが含まれています。 up メソッドは必要に応じて変更できます。down メソッドは up メソッドに基づいて自動的に生成されます。 このファイルをリポジトリにコミットすることで、他の開発者も実行できるようになります。
保留中のマイグレーション
./node_modules/.bin/deepkit-sql migration:pending --path database.ts --migrationDir src/migrations
これにより、保留中のすべてのマイグレーションが表示されます。まだ実行されていない新しいマイグレーションファイルがある場合は、ここに一覧表示されます。
マイグレーションの実行
./node_modules/.bin/deepkit-sql migration:up --path database.ts --migrationDir src/migrations
これにより、次の保留中のマイグレーションが実行されます。
マイグレーションの取り消し
./node_modules/.bin/deepkit-sql migration:down --path database.ts --migrationDir src/migrations
これにより、最後に実行されたマイグレーションが元に戻されます。
フェイクマイグレーション
マイグレーション(up または down)を実行しようとしたものの、失敗したとします。問題を手動で修正しましたが、そのマイグレーションはすでに実行済みであるため、再度実行することができません。このような場合、--fake オプションを使用してマイグレーションをフェイクすることで、実際には実行せずにデータベース上で実行済みとしてマークできます。これにより、次の保留中のマイグレーションを実行できるようになります。
./node_modules/.bin/deepkit-sql migration:up --path database.ts --migrationDir src/migrations --fake