Skip to content

Commit ecbdfbc

Browse files
authored
Load schema when running db:migrate on fresh dbs (rails#53320)
Loading database schemas before db:migrate for a single database was fixed in rails#52830. However, this approach fails when multiple databases are defined. This fix addresses the issue by moving schema loading to occur before initiating database migrations. Fixes rails#52829
1 parent e642926 commit ecbdfbc

File tree

3 files changed

+53
-18
lines changed

3 files changed

+53
-18
lines changed

activerecord/lib/active_record/railties/databases.rake

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -87,22 +87,7 @@ db_namespace = namespace :db do
8787

8888
desc "Migrate the database (options: VERSION=x, VERBOSE=false, SCOPE=blog)."
8989
task migrate: :load_config do
90-
db_configs = ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env)
91-
92-
if db_configs.size == 1 && db_configs.first.primary?
93-
ActiveRecord::Tasks::DatabaseTasks.migrate
94-
else
95-
mapped_versions = ActiveRecord::Tasks::DatabaseTasks.db_configs_with_versions
96-
97-
mapped_versions.sort.each do |version, db_configs|
98-
db_configs.each do |db_config|
99-
ActiveRecord::Tasks::DatabaseTasks.with_temporary_connection(db_config) do
100-
ActiveRecord::Tasks::DatabaseTasks.migrate(version)
101-
end
102-
end
103-
end
104-
end
105-
90+
ActiveRecord::Tasks::DatabaseTasks.migrate_all
10691
db_namespace["_dump"].invoke
10792
end
10893

activerecord/lib/active_record/tasks/database_tasks.rb

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -240,13 +240,32 @@ def truncate_all(environment = env)
240240
end
241241
end
242242

243-
def migrate(version = nil)
243+
def migrate_all
244+
db_configs = ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env)
245+
db_configs.each { |db_config| initialize_database(db_config) }
246+
247+
if db_configs.size == 1 && db_configs.first.primary?
248+
ActiveRecord::Tasks::DatabaseTasks.migrate(skip_initialize: true)
249+
else
250+
mapped_versions = ActiveRecord::Tasks::DatabaseTasks.db_configs_with_versions
251+
252+
mapped_versions.sort.each do |version, db_configs|
253+
db_configs.each do |db_config|
254+
ActiveRecord::Tasks::DatabaseTasks.with_temporary_connection(db_config) do
255+
ActiveRecord::Tasks::DatabaseTasks.migrate(version, skip_initialize: true)
256+
end
257+
end
258+
end
259+
end
260+
end
261+
262+
def migrate(version = nil, skip_initialize: false)
244263
scope = ENV["SCOPE"]
245264
verbose_was, Migration.verbose = Migration.verbose, verbose?
246265

247266
check_target_version
248267

249-
initialize_database(migration_connection_pool.db_config)
268+
initialize_database(migration_connection_pool.db_config) unless skip_initialize
250269

251270
migration_connection_pool.migration_context.migrate(target_version) do |migration|
252271
if version.blank?

railties/test/application/rake/dbs_test.rb

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,37 @@ def db_migrate_and_status(expected_database)
363363
assert_equal "[\"ar_internal_metadata\", \"comments\", \"schema_migrations\"]", list_tables[]
364364
end
365365

366+
test "db:migrate on multiple new dbs loads schema" do
367+
File.write("#{app_path}/config/database.yml", <<~YAML)
368+
development:
369+
primary:
370+
adapter: sqlite3
371+
database: storage/test.sqlite3
372+
queue:
373+
adapter: sqlite3
374+
database: storage/test_queue.sqlite3
375+
YAML
376+
377+
app_file "db/schema.rb", <<-RUBY
378+
ActiveRecord::Schema.define(version: 20140423102712) do
379+
create_table(:comments) {}
380+
end
381+
RUBY
382+
383+
app_file "db/queue_schema.rb", <<-RUBY
384+
ActiveRecord::Schema.define(version: 20141016001513) do
385+
create_table(:executions) {}
386+
end
387+
RUBY
388+
389+
rails "db:migrate"
390+
primary_tables = lambda { rails("runner", "p ActiveRecord::Base.lease_connection.tables.sort").strip }
391+
queue_tables = lambda { rails("runner", "p ActiveRecord::Base.connects_to(database: { writing: :queue }).first.lease_connection.tables.sort").strip }
392+
393+
assert_equal "[\"ar_internal_metadata\", \"comments\", \"schema_migrations\"]", primary_tables[]
394+
assert_equal "[\"ar_internal_metadata\", \"executions\", \"schema_migrations\"]", queue_tables[]
395+
end
396+
366397
test "db:migrate:reset regenerates the schema from migrations" do
367398
app_file "db/migrate/01_a_migration.rb", <<-MIGRATION
368399
class AMigration < ActiveRecord::Migration::Current

0 commit comments

Comments
 (0)