2022/3/17に行われた0.2から0.3へのアップデートでcliの仕様が大幅に変更されてしまったようですね。なのになぜかTypeORM公式ドキュメントのCLIのページをみてもその変更が反映されていない...(?)
具体的には以下のような変更が行われました。
TyepORM 0.2系ではormconfig.jsなどの場所で cli
という設定項目でマイグレーションファイルの出力先を指定していたかと思います。
ですが、公式ドキュメントにある変更ログ を見ると、0.3.0からその cli オプションは消えてしまったようです。
cli option from BaseConnectionOptions (now BaseDataSourceOptions options) was removed (since CLI commands were re-worked).
ほな0.3系でマイグレーションファイルの出力先を指定するにはどうすりゃええねん
ってなってしまった人向けの記事になります。
前提
package.jsonがあるディレクトリでtypeorm0.3系をインストールしていることを前提としています。
$ npm -v
8.12.1
$ node -v
v14.19.1
$ npx typeorm -v
0.3.7
↓DB接続の設定
import "reflect-metadata"
import { DataSource } from "typeorm"
import { User } from "./entity/User"
export const AppDataSource = new DataSource({
type: "mysql",
host: "localhost",
port: 3306,
username: "test",
password: "test",
database: "test",
synchronize: true,
logging: false,
entities: [User],
migrations: ['src/migration/*.ts'],
})
create (空のマイグレーションファイル作成)
src/migration の中に UserMigration という名前でマイグレーションファイルを作りたいと思っているとします。
src がある場所と同じディレクトリで次のようにコマンドを実行してください。
npx typeorm migration:create src/migration/UserMigration
するとsrc/migration内に1655392769030-UserMigration.ts
のように空のマイグレーションファイルが作られます。
generate (entityからのマイグレーションファイル作成)
src/migration の中に UserMigration という名前でsrc/entityにあるuserのエンティティからマイグレーションファイルを作りたいと思っているとします。
次のようにコマンドを実行してください。今回のようにDB接続設定ファイルがtsの場合はtypeorm
ではなく同時にコンパイルも行うtypeorm-ts-node-commonjs
を使う必要があります。
npx typeorm-ts-node-commonjs migration:generate src/migration/UserMigration -d src/data-source.ts
するとsrc/migration内に1655392769030-UserMigration.ts
のようにuserエンティティの内容が反映されたマイグレーションファイルが作られます。
run (マイグレーション実行)
src/migration にマイグレーションファイルがあるとして、マイグレーションを実行したいとします。
以下のコマンドを実行してください。
npx typeorm-ts-node-commonjs migration:run -d src/data-source.ts
するとマイグレーションが実行されます。revert (マイグレーションのロールバック)も同様で、上記の run を revert に変えるだけです。
設定ファイルの参照先とファイル出力先の設定
0.2系ではormconfig.jsなどに以下のようにして、あらかじめマイグレーションファイルの出力先の設定をしていたかと思います。
{
// DB接続などの設定
cli: {
migrationsDir: "src/migration"
entitiesDir: "src/entity"
}
}
それを知ってて上記の方法を見た方だと、コマンドを打つたびにいちいち指定しないといけないの?どこかに設定しておくことはできないの?って思った方もいると思います。
そんな方はとりあえず package.json の scripts に以下のように設定しておくのが無難かと思います。
"scripts": {
"start": "ts-node src/index.ts",
"typeorm": "npx typeorm-ts-node-commonjs",
"migration:create": "npx typeorm migration:create src/migration/${npm_config_name}",
"migration:generate": "npx typeorm-ts-node-commonjs migration:generate src/migration/${npm_config_name} -d src/data-source.ts",
"migration:run": "npx typeorm-ts-node-commonjs migration:run -d src/data-source.ts"
}
このように設定しておけば、例えばgenerateは以下のコマンドで実行できます。
npm run migration:generate --name=UserMigration
だいぶスッキリしましたね(^^)