プロジェクトを立ち上げる準備ができています。ローンチ後の大きな計画があり、データベース構造が変更される予定です。既存のテーブルと新しいテーブルの新しい列、および既存のモデルと新しいモデルへの新しい関連付けです。
データベースが変更されるたびに消去しても問題ないテストデータしか持っていないため、Sequelizeでの移行にはまだ触れていません。
そのため、現在sync force: true
、モデル定義を変更した場合、アプリの起動時に実行しています。これにより、すべてのテーブルが削除され、最初から作成されます。force
新しいテーブルのみを作成するオプションを省略できます。しかし、既存のものを変更した場合、これは役に立ちません。
では、マイグレーションを追加すると、どのように機能するのでしょうか?明らかに、既存のテーブル(データが含まれている)を消去したくないのでsync force: true
、問題外です。アプリの展開手順の一部として開発を支援した他のアプリ(Laravelおよびその他のフレームワーク)では、migrateコマンドを実行して保留中の移行を実行します。しかし、これらのアプリでは、最初の移行にはスケルトンデータベースがあり、データベースは開発の初期の段階でした-最初のアルファリリースなどです。そのため、パーティーに遅れるアプリのインスタンスでさえ、すべてのマイグレーションを順番に実行することで、一度にスピードを上げることができます。
Sequelizeでこのような「最初の移行」を生成するにはどうすればよいですか?私が持っていない場合は、アプリの新しいインスタンスにある段階で移行を実行するためのスケルトンデータベースがないか、最初に同期が実行され、データベースがすべて新しい状態になります新しいテーブルなどですが、移行を実行しようとしても、元のデータベースと連続する各反復を考慮して記述されているため、意味がありません。
私の思考プロセス:すべての段階で、最初のデータベースと各移行のシーケンスは、次の場合に生成されるデータベースと同じ(プラスまたはマイナスのデータ)になるはずです。 sync force: true
実行されます。これは、コード内のモデル記述がデータベース構造を記述しているためです。したがって、移行テーブルがない場合は、同期を実行して、すべての移行が実行されていなくても、完了とマークするだけです。これは私がする必要があるのですか(方法?)、またはSequelizeはこれを自分で行うことになっていますか、それとも間違ったツリーを吠えていますか?そして、私が適切な領域にいる場合、古いモデル(コミットハッシュによって?または各マイグレーションをコミットに関連付けることさえできる)を考えると、ほとんどのマイグレーションを自動生成するための素晴らしい方法があるはずです。移植性のないgit中心のユニバース)と新しいモデル。構造を比較し、データベースを古いものから新しいものに変換するために必要なコマンドを生成し、戻すことができます。その後、開発者は必要な調整(特定のデータの削除/移行など)を行うことができます。
--init
コマンドでsequelizeバイナリを実行すると、空の移行ディレクトリが表示されます。次に走るとsequelize --migrate
と、何も含まれていないSequelizeMetaテーブルが作成され、他のテーブルは作成されません。明らかにそうではありません。そのバイナリは、アプリをブートストラップしてモデルをロードする方法を知らないためです。
私は何かを逃しているに違いない。
TLDR:ライブアプリのさまざまなインスタンスを最新の状態にできるように、アプリとその移行を設定するにはどうすればよいですか。
sync
している場合でも、移行ではデータベース全体が「生成」されるため、スケルトンに依存すること自体が問題です。たとえば、Ruby on RailsワークフローはすべてにMigrationsを使用しており、慣れればかなり素晴らしいものになります。編集:はい、この質問はかなり古いことに気付きましたが、満足のいく答えは一度もなかったため、人々がガイダンスを求めてここに来る可能性があるので、私は貢献すべきだと考えました。