NestJsにおけるMigrationと「synchronize: true」を調べてみた
synchronize: true とは 公式ドキュメントを呼んでいる際は読み飛ばしたが、下記のようなことが書かれていた。 Setting synchronize: true shouldn’t be used in production - otherwise you can lose production data. 翻訳すると「設定synchronize: trueは本番環境では使用しないでください。そうしないと、本番データが失われる可能性があります。」とのこと。読み飛ばすにはあまりにも恐ろしい項目な気もするが、当時に自分は気にも留めなかった。 これがマイグレーション作業と深く結びついている。 synchronize: true この設定は、アプリケーションをデプロイしたときにDBのテーブルがEntityから自動的に生成されるというもの。 そのため前回の記事のように、Entityを作成しセーブすることで自動的にテーブルが作成された。 どうやらすごく便利な設定だと思うようだが、危険もある。 Entityの状態がDBに同期されるため一見便利にみえますが、Entityのカラムを消したときにDBのカラムも消えてしまうため、誤ってPasswordのカラムを消してしまうなどのリスクがあります。 確かに誤って、コードを削除し、保存したらすべてのデータが消えるというのは非常に恐ろしい。 そこで本番に上げる前にsynchronize: falseにし、マイグレーションファイルを元に手動でDBの状態を更新するようにしていく必要がある。 Migrationとは マイグレーションの正体は普通のJSファイルで、SQLを使用してデータベースのスキーマを更新したり、既存のデータベースに変更を加えるというものです。 つまり、同期的な変更ではなく、こちらでコマンドを行うことで、データベースを変更してくれる。 いざ、本番で操作するよりは、開発の時点でテスト的に触っておいた方が良さそうなので、どこかでテストする。その際、詳細な操作方法を追記する。