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>