Changes to behavior in rails db:migrate:name command


Let us assume we have a multi-database configuration in our Rails app having a primary and secondary database.

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

Before

In Rails 6, rails db:migrate would dump the schemas of all the databases present in database.yml.

In our case, it would generate the following two schema files.

db/schema.rb
db/secondary_schema.rb

Now, with rails db:migrate:primary, we would expect the primary database schema dump file to be generated. But turns out, it is not the case.

One additional inconsistency is, rails db:migrate resets the ActiveRecord::Base connection back to the original configuration, but rails db:migrate:primary does not.

The result of ActiveRecord::Base.connection_db_config.inspect after execution of rails db:migrate is as follows:

#<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

And the result of ActiveRecord::Base.connection_db_config.inspect after execution of rails db:migrate:secondary is:

#<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>

After

Rails has made changes to dump schema(or structure) for a database and reset ActiveRecord::Base to its original configuration when db:migrate:name is executed.

Now we can run rails db:migrate:name and it will generate the schema file for the database, we run the migration for.

For instance:

Running rails db:migrate:primary would generate db/schema.rb.

Also, the result of ActiveRecord::Base.connection_db_config.inspect is same before and after running rails db:migrate:secondary:

#<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>