概要
原著者の許諾を得て翻訳・公開いたします。
- 英語記事: Changes to behavior in rails db:migrate:name command | Saeloun Blog
- 原文公開日: 2020/09/09
- 著者: Vamsi Pavan Mahesh
- サイト: Saeloun Blog | Ruby on Rails Consulting Company based in San Francisco and Boston | Page 1 | Saeloun Blog
Rails: db:migrate:nameコマンドの振る舞いの変更(翻訳)
Railsアプリに以下のようなマルチデータベースの設定があり、primaryとsecondaryのデータベースがそれぞれあるとします。
default: &default
adapter: sqlite3
development:
primary:
<<: *default
database: db/development.sqlite3
pool: 10
timeout: 6000
secondary:
<<: *default
database: db/secondary_development.sqlite3
pool: 20
timeout: 10000
⚓ 変更前
Rails 6でrails db:migrate
を実行すると、database.ymlに存在するすべてのスキーマをダンプします。
上の場合、以下の2つのスキーマファイルが生成されます。
db/schema.rb
db/secondary_schema.rb
ここでrails db:migrate:primary
を実行したらprimaryデータベースのスキーマダンプが生成されることが期待されますが、そうならないことに気づきます。
一貫していない点がもうひとつあります。rails db:migrate
を実行するとActiveRecord::Base
コネクションがオリジナルの設定に戻りますが、rails db:migrate:primary
ではそうなりません。
rails db:migrate
を実行した後のActiveRecord::Base.connection_db_config.inspect
の結果は以下のようになります。
#<ActiveRecord::DatabaseConfigurations::HashConfig:0x00007fdc09a99ee8 @env_name="development", @name="primary", @spec_name="primary", @config={:adapter=>"sqlite3", :database=>"db/development.sqlite3", :pool=>10, :timeout=>6000}, @owner_name=nil
しかしrails db:migrate:secondary
を実行した後のActiveRecord::Base.connection_db_config.inspect
の結果は以下のようになります。
#<ActiveRecord::DatabaseConfigurations::HashConfig:0x00007f830df39098 @env_name="development", @name="secondary", @spec_name="secondary", @config={:adapter=>"sqlite3", :database=>"db/secondary_development.sqlite3", :pool=>20, :timeout=>10000}, @owner_name=nil>
⚓ 変更後
Railsのデータベースのダンプスキーマ(構造)が変更され(#38586)、db:migrate:name
を実行するとActiveRecord::Base
をオリジナルの設定にリセットするようになりました(#38587)。
これで、rails db:migrate:name
を実行してデータベースのスキーマファイルが生成されるようになり、これでマイグレーションを実行できるようになります。
例:
rails db:migrate:primary
を実行するとdb/schema.rb
が生成されます。
また、rails db:migrate:secondary
の実行前も実行後も、ActiveRecord::Base.connection_db_config.inspect
の結果が同じになります。
#<ActiveRecord::DatabaseConfigurations::HashConfig:0x00007fa7d9d36ed0 @env_name="development", @name="primary", @spec_name="primary", @config={:adapter=>"sqlite3", :database=>"db/development.sqlite3", :pool=>10, :timeout=>6000}, @owner_name=nil>