ここで非常に簡単な質問-アプリがより複雑になるにつれて移行が遅くて面倒になり、代わりに呼び出す必要のあるrake db:schema:load
がもっときれいな場合、なぜ移行が存在するのですか?
上記に対する答えが、バージョン管理(データベースへの変更の段階的な記録)に移行が使用されるというものである場合、アプリがより複雑になり、代わりにrake db:schema:load
が使用されるため、プライマリを維持し続けますか関数?
この質問への回答から:rake db:schema:load
データを削除します 実動サーバー上で使用する場合は注意してください。
移行により、データベースに順方向および逆方向のステップ変更が提供されます。実稼働環境では、展開中にデータベースに増分変更を行う必要があります。移行は、この機能にロールバックフェイルセーフを提供します。本番サーバーでrake db:schema:load
を実行すると、すべての本番データが削除されます。これは危険な習慣です。
そうは言っても、移行をときどき「崩壊」させるのはまともなプラクティスだと思います。これには、古いマイグレーションを削除し、それらを単一のマイグレーション(schema.rb
ファイルに非常に類似)に置き換え、schema_migrations
テーブルを更新してこの変更を反映する必要があります。 これを行うときは非常に注意してください!注意していない場合は、簡単に本番データを削除できます。
補足として、移行ファイルにデータ作成を絶対に入れないでください。 seed.rb
ファイルは、このタスク、またはカスタムrakeまたはデプロイタスクに使用できます。これを移行ファイルに入れると、データベーススキーマ仕様とデータ仕様が混在し、移行ファイルの実行時に競合が発生する可能性があります。
この投稿に出くわしましたが、それはずっと前のことで、私が期待していた答えが見つかりませんでした。
rake db:schema:load
は、システムを実稼働環境に配置するのに初めて役立ちます。その後、移行を通常どおり実行する必要があります。
また、スキーマには移行をクリーンアップした場合でも他のマシンを運用環境に置くためのすべての情報があるため、いつでも移行をクリーンアップできます。
移行により、データベースにもデータを追加できます。ただし、db:schema:loadはschemaのみをロードします。
移行はロールバックでき、追加機能を提供できるためです。たとえば、スキーマ変更の一部として一部のデータを変更する必要がある場合、移行としてそれを行う必要があります。
他のORMのユーザーとして、Railsには「同期と更新」機能がなかったことは常に奇妙に思えました。つまり、スキーマファイル(最新のスキーマ全体を表す)を使用して、既存のDB構造を調べ、必要に応じてテーブル、列、インデックスを追加/削除します。
私にとっては、おそらく少し遅くても、これははるかに堅牢です。
rake db:migrate
データベース内のテーブルをセットアップします。移行コマンドを実行すると、db/migrate /でRubyファイルが検索され、最も古いファイルから実行されます。各移行ファイル名の先頭にタイムスタンプがあります。
まだ実行されていない移行を実行するrake db:migrate
とは異なり、rake db:schema:load
は、db/schema.rb
で既に生成されているスキーマをデータベースにロードします。
rake database commands here の詳細を確認できます。
私はすでにコメントとして投稿しましたが、db/schema.rbファイルのコメントをここに入れる方が良いと感じています:
# Note that this schema.rb definition is the authoritative source for your
# database schema. If you need to create the application database on another
# system, you should be using db:schema:load, not running all the migrations
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
# you'll amass, the slower it'll run and the greater likelihood for issues).
#
# It's strongly recommended that you check this file into your version control system.
実際、私の経験では、schema.rbファイルではなくgitに移行ファイルを置く方が良いということです...