LoginSignup
4

More than 1 year has passed since last update.

TypeORM 0.3系のマイグレーション

Last updated at Posted at 2022-07-10

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接続の設定

src/data-source.ts
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などに以下のようにして、あらかじめマイグレーションファイルの出力先の設定をしていたかと思います。

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

だいぶスッキリしましたね(^^)


↓参考
https://github.com/typeorm/typeorm/issues/8810

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4