1. ホーム
  2. ruby-on-rails

[解決済み] Rails は、データベースに対して実行されたマイグレーションをどのように追跡しているのですか?

2022-12-21 02:51:23

質問

Railsのドキュメントによると http://guides.rubyonrails.org/migrations.html

"アクティブレコードはどのマイグレーションが既に実行されたかを追跡するので、ソースを更新して rake db:migrate." を実行するだけでよいのです。

ActiveRecordは実際にどのようにこれを行うのでしょうか? Active Recordはデータをどこに保存するのですか?

データベース自体に保存されているのではないでしょうか? どこかのテーブルに。

私の開発マシン上で、私はすべての移行を実行しました。 それから、mysqldump を使用して本番データベースをコピーしました。 それから "rake db:migrate:status" を実行すると、本番データベースで実行する必要のある移行が正しく表示されました。

私は、ActiveRecord がタイムスタンプを使用して最後に実行されたマイグレーションを追跡していると考えていました。 しかし、ActiveRecord は別のコード ブランチからマージされた "古い"マイグレーションを正しく実行するので、これは真実ではないと思われます。

このことについて内部知識をお持ちのどなたか、詳しく説明していただけませんか? ありがとうございます。

どのように解決するのですか?

Railsは、データベース内に schema_migrations というテーブルを作成し、どのマイグレーションが実行されたかを記録します。

このテーブルには1つのカラムがあります。 version . Railsがマイグレーションを実行すると、マイグレーションのファイル名の先頭の数字を取り、その"version"の行を挿入し、それが実行されたことを表します。そのマイグレーションをロールバックすると、Railsは対応する行を schema_migrations .

例えば、マイグレーションファイルの名前を 20120620193144_create_users.rb という名前のマイグレーションファイルを実行すると、新しい行が挿入され、そのバージョンは 20120620193144 の中に schema_migrations テーブルの中に入れます。

以前のバージョンを使ったマイグレーションを導入することはいつでも自由です。に対応する行がない場合、Railsは常に新しいmigrationsを実行します。 schema_migrations . 先頭の数字はタイムスタンプである必要はないので、マイグレーションを 001_blah.rb . Railsの初期のバージョンではこの形式を使用し、新しく生成されたマイグレーションに連番を使用していました。後のバージョンでは、複数の開発者が同じ番号のマイグレーションを独立して生成するのを防ぐために、タイムスタンプに変更されました。