#はじめに
TypeORMのMigrationについてのメモです。
NestJSに関するこれまでの記事については以下をご覧ください。
実装したコードを確認したい方は以下よりご確認ください。
#実装
AppModuleのsynchronize
の設定がtrueだと、アプリケーションをデプロイしたときにDBのテーブルがEntityから自動的に生成されます。
Entityの状態がDBに同期されるため一見便利にみえますが、Entityのカラムを消したときにDBのカラムも消えてしまうため、誤ってPasswordのカラムを消してしまうなどのリスクがあります。
そのため、本番環境のデプロイ前になったらsynchronize: false
にして、マイグレーションファイルを元に手動でDBの状態を更新してあげるようにします。
TypeORMではDBに接続するための情報type
database
entities
が必要となります。
Moduleにこれらの情報を記述しても読み込まれないので、ormconfig.js
にそれぞれの設定を記述してmodule.exports
してあげます。
開発環境development
、テスト環境test
、本番環境production
で接続するDBの種類などが異なるので、switch文で設定を切り替えます。
var dbConfig = {
synchronize: false,
migrations: ['migrations/*.js'],
cli: {
migrationsDir: 'migrations',
},
};
switch (process.env.NODE_ENV) {
case 'development':
module.exports = Object.assign(dbConfig, {
type: 'sqlite',
database: 'db.sqlite',
entities: ['**/*.entity.js'],
});
break;
case 'test':
module.exports = Object.assign(dbConfig, {
type: 'sqlite',
database: 'test.sqlite',
entities: ['**/*.entity.ts'],
migrationsRun: true,
});
break;
case 'production':
module.exports = Object.assign(dbConfig, {
type: 'postgres',
url: process.env.DATABASE_URL,
migrationsRun: true,
entities: ['**/*.entity.js'],
ssl: {
rejectUnauthorized: false,
},
});
break;
default:
throw new Error('unknown error');
}
つぎにpackage.json
のscripts
へ以下を追記します。
"typeorm": "cross-env NODE_ENV=development node --require ts-node/register ./node_modules/typeorm/cli.js"
以下のコマンドでマイグレーションファイルが生成されます。
npm run typeorm migration:generate -- -n initial-schema -o
そして以下のコマンドでマイグレーションファイルを元にmigrate(DBテーブルの生成)が実行されます。
npm run typeorm migration:run
#参考資料