【NestJS】npx typeorm migration:generateでエラーが発生する時の対処法
こんにちは、 です。
エラーが出たので備忘録としてここに記します。
No changes in database schema were found - cannot generate a migration. To create a new empty migration use "typeorm migration:create" command
NestJS × TypeORMでマイグレーションを行おうとしたら、以下のようなエラーが出た。
$ npx typeorm migration:generate -n Create〇〇
>> No changes in database schema were found - cannot generate a migration. To create a new empty migration use "typeorm migration:create" command
どうやら、
と言われている模様。
実際にtypeorm migration:create
を実行すると、中身の書かれていないmigrationファイルが生成されてしまう。
エラーについて調べてみた
No changes in database schema were found - cannot generate a migration. To create a new empty migration use "typeorm migration:create" command
上記のエラーを原文ママ検索してみた。
すると以下のような記事が出てきた。(NestJSの日本語記事少なすぎ。。。)
結局のところ
$ npx typeorm schema:drop
のコマンドで一回schemaをdropした。
なるほど、さすが偉大なる先駆者。
と言われるのは、すでにデータベーススキーマが存在しているからか。
では一度スキーマをdropしたら、そこに差が生まれるからmigrationが実行されるはず。
早速drop。
$ npx typeorm schema:drop
>> ... Database schema has been successfully droped.
dropには成功。
このまま続けてmigrationを実行すれば、
$ npx typeorm migration:generate -n Create〇〇
>> No changes in database schema were found - cannot generate a migration. To create a new empty migration use "typeorm migration:create" command
.
.
.
は?
プロジェクト全体を見直してみる
今回のプロジェクトは、以下のようなディレクトリ構成になっている。(重要なもの以外は省きます)
.
├── dist
│ ├── app.module.d.ts
│ ├── app.module.js
│ ├── app.module.js.map
│ ├── 〇〇
│ │ ├── dto
│ │ │ ├── create-〇〇.dto.d.ts
│ │ │ ├── create-〇〇.dto.js
│ │ │ └── create-〇〇.dto.js.map
│ │ ├── entities
│ │ │ ├── 〇〇.entity.d.ts
│ │ │ ├── 〇〇.entity.js
│ │ │ └── 〇〇.entity.js.map
│ │ ├── 〇〇-status.enum.d.ts
│ │ ├── 〇〇-status.enum.js
│ │ ├── 〇〇-status.enum.js.map
│ │ ├── 〇〇.model.d.ts
│ │ ├── 〇〇.model.js
│ │ ├── 〇〇.model.js.map
│ │ ├── 〇〇.controller.d.ts
│ │ ├── 〇〇.controller.js
│ │ ├── 〇〇.controller.js.map
│ │ ├── 〇〇.module.d.ts
│ │ ├── 〇〇.module.js
│ │ ├── 〇〇.module.js.map
│ │ ├── 〇〇.service.d.ts
│ │ ├── 〇〇.service.js
│ │ └── 〇〇.service.js.map
│ ├── main.d.ts
│ ├── main.js
│ ├── main.js.map
│ └── tsconfig.build.tsbuildinfo
├── ormconfig.js
├── src
│ ├── app.module.ts
│ ├── 〇〇
│ │ ├── dto
│ │ │ └── create-〇〇.dto.ts
│ │ ├── entities
│ │ │ └── 〇〇.entity.ts
│ │ ├── 〇〇-status.enum.ts
│ │ ├── 〇〇.model.ts
│ │ ├── 〇〇.controller.ts
│ │ ├── 〇〇.module.ts
│ │ └── 〇〇.service.ts
│ └── main.ts
├── tsconfig.build.json
└── tsconfig.json
そしてTypeORMのmigrationに使われる設定ファイル、ormconfig.js
の中身は以下のようになっていた。
module.exports = {
type: 'postgres',
host: 'localhost',
port: 5432,
username: 'postgres',
password: 'postgres',
database: 'postgres',
autoLoadEntities: true,
entities: ['dist/entities/*.entity.js'],
migrations: ['dist/migrations/*.js'],
cli: {
entitiesDir: 'src/entities',
migrationsDir: 'src/migrations',
},
};
この二つの情報で、もうこのエラーがなぜ起こるのか分かった方もいるかもしれません。
もし分かった方はとても鋭い(僕はこのエラー解決に2日かかった)。
そう、migrationは、ormconfig.js
のこの部分
module.exports = {
...
entities: ['dist/entities/*.entity.js'],
...
};
つまりdist/entities/〇〇.entity.js
が存在していなければならない。
にも関わらず、自分はsrc/〇〇/entities/〇〇.entity.js
を作成した状態でビルドし、dist/〇〇/entities/〇〇.entity.js
を生成しているではないか!!
(そりゃmigrationされるわけないやん。。。)
今回はormconfig.js
側に記述したディレクトリ構成に統一し、
-
dist/〇〇/entities/
を削除。 -
src/〇〇
をsrc
直下に移動。 - 念の為、もう一度
npx typeorm schema:drop
を実行。 -
npm run start
でビルドしなおす。 - 'dist/entities/〇〇.entity.js'が存在することを確認。
そして、
$ npx typeorm migration:generate -n Create〇〇
>> Migration ... has been generated successfully.
キタァァァアアア!!! .`+(嬉´∀`*‡)ノ
結局は自分の凡ミスであることが多い、いい教訓になりました。。。
No changes in database schema were found - cannot generate a migration. To create a new empty migration use "typeorm migration:create" commandエラーの対処法
まあ、僕の場合はイレギュラーでしたが、基本的には
$ npx typeorm schema:drop
$ npx typeorm migration:generate -n Create〇〇
でいけると思います。
ただ、entities/〇〇.entity.js
がdistディレクトリ内にビルドされていないとmigrationできないので、しっかり確認してから行いましょう!!!
Author And Source
この問題について(【NestJS】npx typeorm migration:generateでエラーが発生する時の対処法), 我々は、より多くの情報をここで見つけました https://zenn.dev/ebaryo/articles/ac6f38140218df著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Collection and Share based on the CC protocol