When running db:migrate on a fresh database, load the database schema before running migrations.

If we have an existing schema file and we run db:migrate before setting up the database, we will not load the schema before running migrations, so when we dump the schema will overwrite the existing schema file and lose the tables define there. Instead, we should check if the db is setup and if it is not lload the schema, before running migrations.
This commit is contained in:
Andrew Novoselac 2024-09-07 18:39:40 -04:00 committed by Rafael Mendonça França
parent 9356db3d4b
commit 66aacb6333
No known key found for this signature in database
GPG Key ID: FC23B6D0F1EEE948
3 changed files with 41 additions and 15 deletions

View File

@ -1,3 +1,7 @@
* When running `db:migrate` on a fresh database, load the database schema before running migrations.
*Andrew Novoselac*
* Fix an issue where `.left_outer_joins` used with multiple associations that have * Fix an issue where `.left_outer_joins` used with multiple associations that have
the same child association but different parents does not join all parents. the same child association but different parents does not join all parents.

View File

@ -178,22 +178,9 @@ module ActiveRecord
dump_db_configs = [] dump_db_configs = []
each_current_configuration(env) do |db_config| each_current_configuration(env) do |db_config|
with_temporary_pool(db_config) do database_initialized = initialize_database(db_config)
begin
database_initialized = migration_connection_pool.schema_migration.table_exists?
rescue ActiveRecord::NoDatabaseError
create(db_config)
retry
end
unless database_initialized seed = true if database_initialized
if File.exist?(schema_dump_path(db_config))
load_schema(db_config, ActiveRecord.schema_format, nil)
end
seed = true
end
end
end end
each_current_environment(env) do |environment| each_current_environment(env) do |environment|
@ -259,6 +246,8 @@ module ActiveRecord
check_target_version check_target_version
initialize_database(migration_connection_pool.db_config)
migration_connection_pool.migration_context.migrate(target_version) do |migration| migration_connection_pool.migration_context.migrate(target_version) do |migration|
if version.blank? if version.blank?
scope.blank? || scope == migration.scope scope.blank? || scope == migration.scope
@ -667,6 +656,26 @@ module ActiveRecord
rescue ActiveRecord::NoDatabaseError rescue ActiveRecord::NoDatabaseError
end end
end end
def initialize_database(db_config)
with_temporary_pool(db_config) do
begin
database_already_initialized = migration_connection_pool.schema_migration.table_exists?
rescue ActiveRecord::NoDatabaseError
create(db_config)
retry
end
unless database_already_initialized
schema_dump_path = schema_dump_path(db_config)
if schema_dump_path && File.exist?(schema_dump_path)
load_schema(db_config, ActiveRecord.schema_format, nil)
end
end
!database_already_initialized
end
end
end end
end end
end end

View File

@ -350,6 +350,19 @@ module ApplicationTests
db_migrate_and_status database_url_db_name db_migrate_and_status database_url_db_name
end end
test "db:migrate on new db loads schema" do
app_file "db/schema.rb", <<-RUBY
ActiveRecord::Schema.define(version: 20140423102712) do
create_table(:comments) {}
end
RUBY
rails "db:migrate"
list_tables = lambda { rails("runner", "p ActiveRecord::Base.lease_connection.tables.sort").strip }
assert_equal "[\"ar_internal_metadata\", \"comments\", \"schema_migrations\"]", list_tables[]
end
def db_schema_dump def db_schema_dump
Dir.chdir(app_path) do Dir.chdir(app_path) do
args = ["generate", "model", "book", "title:string"] args = ["generate", "model", "book", "title:string"]