TypeORMのマイグレーションを使う時は migration:generate によるSQL出力を(なるべくそのまま)使おう
なんで?
まず前提として、TypeORMのマイグレーションは
QueryRunner によるなんかいい感じに型が付いているもののドキュメントがない謎のAPI
以下いい感じAPI
QueryRunner#query による何も考えずにSQLを実行する
以下SQL自動生成
の2つがある
一見いい感じAPIの方が良さそうに思えるが
QueryRunnerのいい感じAPIはTypeORMのQueryRunnerの挙動にロックインされる
ので、移植性がない
まあ理論上できないことはないがしんどい
ということは
TypeORMから別のORMに移れない
Node.jsのままなら別のORMに移りマイグレーションだけはTypeORMを使うというのも手かもしれない
が、別言語に移る (Go, Rust, etc...) 時にその部分のマイグレーションだけ一生TypeORMに頼るのは無理がある
あと挙動が変わらないという保証もない
SQL自動生成であれば (DBの挙動変更を踏まない限り) 挙動はORMによって変わったりしないはず
migration:generate じゃなくても素でSQL書けばいいんじゃないの?という声
最初からmigration:generate を使って、後でやめるのは簡単
だが、素SQL/いい感じAPIを使っている時にあとから migration:generate を使うのは困難
インデックスの名前が合わなかったりして、とても目を通したくない差分が出まくる
あと素でSQLをゴリゴリ書ける人ばかりじゃない
私自身はまあ書こうと思えば書けなくはないけど、あえて書きたくはない
企業のクローズドソースな環境だと教育でなんとかできるかもしれない
が、OSSでちょっと貢献したいんですよ〜って人に素でSQLをゴリゴリ書かせるのはつらいのではないか
特にスキーマ変更回りは
Tips
migration:generate を使うにしても、生成されたSQL文は手でインデントだけ整えておくと後で読みやすい
本当はlintにやってもらいたいんだが…
TypeORM側でやってくれてもいい