Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails関連

Rails: db:migrate:nameコマンドの振る舞いの変更(翻訳)

概要

原著者の許諾を得て翻訳・公開いたします。

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>

CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。