rake db:schema:loadと移行


171

ここで非常に単純な質問-アプリが複雑になるにつれて移行が遅くなり面倒になる可能性がある場合rake db:schema:load、代わりに呼び出すクリーナーがはるかに多い場合、なぜ移行が存在するのですか?

上記の答えがバージョン管理(データベースへの変更の段階的な記録)に移行が使用されるというものである場合、アプリがより複雑になりrake db:schema:load、代わりに使用されるにつれて、アプリは主要機能を維持し続けますか?


注意:

この質問への回答から:本番サーバー上のrake db:schema:load データを削除するので、使用するときは注意してください。


5
+1移行の目的を理解できませんでした。なぜバージョン管理だけではないのですか?
代替

5
@代替-移行では、他のことを行うことができます。たとえば、null以外の列を追加する必要がある場合は、デフォルト値を使用する代わりに、その列にデータをスマートに入力できます。
ジョシュM.

回答:


208

移行により、データベースに対して前進および後退のステップ変更が提供されます。運用環境では、展開中にデータベースに増分変更を加える必要があります。移行では、この機能にフェイルセーフロールバックを提供します。rake db:schema:load本番サーバーで実行すると、すべての本番データが削除されます。これは危険な習慣です。

そうは言っても、移行をときどき「崩壊」させることはまともな習慣だと私は信じています。これには、古い移行を削除し、それらを単一の移行(schema.rbファイルとよく似ています)に置き換え、schema_migrationsテーブルを更新してこの変更を反映する必要があります。これを行うときは十分注意してください!注意しないと、運用データを簡単に削除できます。

余談ですが、データの作成を移行ファイルに含めないでください。このseed.rbファイルは、このタスク、またはカスタムのrakeまたはデプロイタスクに使用できます。これを移行ファイルに入れると、データベーススキーマ仕様とデータ仕様が混在し、移行ファイルの実行時に競合が発生する可能性があります。


80
rake db:schema:loadがすべての本番データを削除することを通知してくれてありがとう!
Magne

2
「折りたたまれた」移行をスキーマを模倣する新しいものに置き換えるのではなく、それらを消去し、ユーザーに新規インストールに対してdb:schema:load実行しようとした場合に使用するように促す宝石を書きましたdb:migrate。@ clear_migrations
Yarin、

おそらく明白な答えですが、本番環境への最初のプッシュの前に、すべての移行を削除し、最初の移行としてdb.schemaを使用することをお勧めしますか?
dtc 2015年

30

ずっと前にこの投稿を偶然見つけましたが、私が期待していた答えが見つかりませんでした。

rake db:schema:loadシステムを初めて運用するのに最適です。その後、マイグレーションを通常どおり実行する必要があります。

スキーマには、移行をクリーンアップした場合でも他のマシンを本番環境に配置するためのすべての情報が含まれているため、いつでも移行をクリーンアップするのに役立ちます。


移行を使用する必要がないため、移行を「クレンジング」できますか?奇妙な発言のように聞こえます。
阿部ペトリロ2013

db:schema:load開発サイクル全体で数秒間を1秒間削る以外に、どのような利点があるのか​​私にはわかりません。ビルドに30秒以上かかるアプリを使用したことがありますか?私は現在、移行ファイルにバグがあるアプリで作業しており、バグの修正がないか実行してdb:schema:loadいないと移行できません。そのため、schema:loadは、アプリの開発に関して何か問題があった場合に使用します。
Ninjaxor 2015年

移行を続けるためにもう1つ私が主張するのは、Railsコアチームがユーザーをに誘導するということinstead of editing schema.rb, please use the migrations featureです。したがってdb:schema:load、自動生成するマイグレーションがない自動生成ファイルで実行している場合は、スキーマを手動で「編集」し、マイグレーションを使用しないという方法で効果的に進んでいます。私はこれについてRailsガイドから引用したいのですが、彼らはschema:loadについては触れていません。これは、schema:load機能へのアプローチ方法を決定する際の私の欲求不満に加えます。= /
Ninjaxor 2015年

私はそれに同意したからこそこのページに行きました。私の経験では、サイトが運用環境に入ると、移行を使用して変更する方がはるかに安全です。それにもかかわらず、db / schema.rbの冒頭のコメントは、正反対のことを正確に述べています。(.gitignoreにdb / schema.rbを入れるのを忘れたので、すべてのプロジェクトの最初に問題があります...)
user1251840

@AbePetrilloすごいこのコメントを完全に逃しました。もちろん、そうではありません。必要に応じて、すべての本番マシンで実行された古い移行をクリーンアップできるということです。長年にわたって私は常にそれらを持ち歩きましたが、私の「いつでも移行をクリーンアップするのに役立ちます」という発言は、「移行を使用する必要がない」という意味ではありませんでした。したがって、新しいマシンをデプロイするときは、ではなく実行rake db:schema:loadしてくださいrake db:migrate。その後は、次のことができrake db:migrateます。
ereslibre

9

移行では、データベースにもデータを追加できます。しかし、db:schema:loadはスキーマのみをロードします。


6

移行をロールバックして、追加機能を提供できるからです。たとえば、スキーマの変更の一部として一部のデータを変更する必要がある場合、それを移行として行う必要があります。


4

他のORMのユーザーとして、Railsに「同期および更新」機能がないのはいつも奇妙に思えました。つまり、スキーマファイル(最新のスキーマ全体を表す)を使用して、既存のDB構造を調べ、必要に応じてテーブル、列、インデックスを追加/削除します。

私にとっては、少し遅くても、これははるかに堅牢です。


1
1つの複雑なスキーマから別のスキーマにデータを含むデータベースを移行するタスクは、場合によっては簡単ではありません。これは自動的に解決されない場合があり、データが単一のステップで一貫して移行されない場合があります。Railsの移行はマスターであり、スキーマは依存しています。スキーマは移行のたびに自動的に再作成されますが、その逆は行われません。
オクラ2016年

Rails独自のガイドschemaは、それが移行ではなくマスターであることを明示的に述べています。
ドレンミ2018年

0

私はすでにコメントとして投稿しましたが、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に移行ファイルを置く方が良いということです...


0

rake db:migrateデータベースにテーブルを設定します。移行コマンドを実行すると、db / migrate /でルビファイルが検索され、最も古いファイルから実行されます。各移行ファイル名の先頭にタイムスタンプがあります。

rake db:migrateそれはまだ実行されていない移行を実行するのとは異なり、rake db:schema:loadすでに生成されdb/schema.rbているスキーマをデータベースにロードします。

rakeデータベースコマンドの詳細については、こちらをご覧ください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.