diff --git a/activerecord/lib/active_record/tasks/database_tasks.rb b/activerecord/lib/active_record/tasks/database_tasks.rb index 387004c71cfb3..8b034711d2b4a 100644 --- a/activerecord/lib/active_record/tasks/database_tasks.rb +++ b/activerecord/lib/active_record/tasks/database_tasks.rb @@ -347,6 +347,24 @@ def schema_up_to_date?(configuration, format = ActiveRecord::Base.schema_format, ActiveRecord::InternalMetadata[:schema_sha1] == schema_sha1(file) end + def reconstruct_from_schema(configuration, format = ActiveRecord::Base.schema_format, file = nil, environment = env, spec_name = "primary") # :nodoc: + file ||= dump_filename(spec_name, format) + + check_schema_file(file) + + ActiveRecord::Base.establish_connection(configuration) + + if schema_up_to_date?(configuration, format, file, environment, spec_name) + truncate_tables(configuration) + else + purge(configuration) + load_schema(configuration, format, file, environment, spec_name) + end + rescue ActiveRecord::NoDatabaseError + create(configuration) + load_schema(configuration, format, file, environment, spec_name) + end + def dump_schema(configuration, format = ActiveRecord::Base.schema_format, spec_name = "primary") # :nodoc: require "active_record/schema_dumper" filename = dump_filename(spec_name, format) diff --git a/activerecord/lib/active_record/test_databases.rb b/activerecord/lib/active_record/test_databases.rb index 999830ba794f9..373f4718c49cc 100644 --- a/activerecord/lib/active_record/test_databases.rb +++ b/activerecord/lib/active_record/test_databases.rb @@ -8,31 +8,16 @@ module TestDatabases # :nodoc: create_and_load_schema(i, env_name: Rails.env) end - ActiveSupport::Testing::Parallelization.run_cleanup_hook do - drop(env_name: Rails.env) - end - def self.create_and_load_schema(i, env_name:) old, ENV["VERBOSE"] = ENV["VERBOSE"], "false" ActiveRecord::Base.configurations.configs_for(env_name: env_name).each do |db_config| db_config.config["database"] += "-#{i}" - ActiveRecord::Tasks::DatabaseTasks.create(db_config.config) - ActiveRecord::Tasks::DatabaseTasks.load_schema(db_config.config, ActiveRecord::Base.schema_format, nil, env_name, db_config.spec_name) + ActiveRecord::Tasks::DatabaseTasks.reconstruct_from_schema(db_config.config, ActiveRecord::Base.schema_format, nil, env_name, db_config.spec_name) end ensure ActiveRecord::Base.establish_connection(Rails.env.to_sym) ENV["VERBOSE"] = old end - - def self.drop(env_name:) - old, ENV["VERBOSE"] = ENV["VERBOSE"], "false" - - ActiveRecord::Base.configurations.configs_for(env_name: env_name).each do |db_config| - ActiveRecord::Tasks::DatabaseTasks.drop(db_config.config) - end - ensure - ENV["VERBOSE"] = old - end end end