mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Add config.active_record.dump_schemas.
Fixes db:structure:dump when using schema_search_path and PostgreSQL extensions. Closes #17157.
This commit is contained in:
parent
80f66d405c
commit
7ab36f4532
5 changed files with 69 additions and 7 deletions
|
@ -1,3 +1,10 @@
|
|||
* Add `config.active_record.dump_schemas` to fix `db:structure:dump`
|
||||
when using schema_search_path and PostgreSQL extensions.
|
||||
|
||||
Fixes #17157.
|
||||
|
||||
*Ryan Wallace*
|
||||
|
||||
* Renaming `use_transactional_fixtures` to `use_transactional_tests` for clarity.
|
||||
|
||||
Fixes #18864.
|
||||
|
|
|
@ -85,6 +85,15 @@ module ActiveRecord
|
|||
mattr_accessor :dump_schema_after_migration, instance_writer: false
|
||||
self.dump_schema_after_migration = true
|
||||
|
||||
##
|
||||
# :singleton-method:
|
||||
# Specifies which database schemas to dump when calling db:structure:dump.
|
||||
# If :schema_search_path (the default), it will dumps any schemas listed in schema_search_path.
|
||||
# Use :all to always dumps all schemas regardless of the schema_search_path.
|
||||
# A string of comma separated schemas can also be used to pass a custom list of schemas.
|
||||
mattr_accessor :dump_schemas, instance_writer: false
|
||||
self.dump_schemas = :schema_search_path
|
||||
|
||||
mattr_accessor :maintain_test_schema, instance_accessor: false
|
||||
|
||||
mattr_accessor :belongs_to_required_by_default, instance_accessor: false
|
||||
|
|
|
@ -46,7 +46,15 @@ module ActiveRecord
|
|||
|
||||
def structure_dump(filename)
|
||||
set_psql_env
|
||||
search_path = configuration['schema_search_path']
|
||||
|
||||
search_path = case ActiveRecord::Base.dump_schemas
|
||||
when :schema_search_path
|
||||
configuration['schema_search_path']
|
||||
when :all
|
||||
nil
|
||||
when String
|
||||
ActiveRecord::Base.dump_schemas
|
||||
end
|
||||
unless search_path.blank?
|
||||
search_path = search_path.split(",").map{|search_path_part| "--schema=#{Shellwords.escape(search_path_part.strip)}" }.join(" ")
|
||||
end
|
||||
|
|
|
@ -195,21 +195,54 @@ module ActiveRecord
|
|||
'adapter' => 'postgresql',
|
||||
'database' => 'my-app-db'
|
||||
}
|
||||
@filename = "awesome-file.sql"
|
||||
|
||||
ActiveRecord::Base.stubs(:connection).returns(@connection)
|
||||
ActiveRecord::Base.stubs(:establish_connection).returns(true)
|
||||
Kernel.stubs(:system)
|
||||
File.stubs(:open)
|
||||
end
|
||||
|
||||
def test_structure_dump
|
||||
filename = "awesome-file.sql"
|
||||
Kernel.expects(:system).with("pg_dump -i -s -x -O -f #{filename} my-app-db").returns(true)
|
||||
@connection.expects(:schema_search_path).returns("foo")
|
||||
Kernel.expects(:system).with("pg_dump -i -s -x -O -f #{@filename} my-app-db").returns(true)
|
||||
|
||||
ActiveRecord::Tasks::DatabaseTasks.structure_dump(@configuration, filename)
|
||||
assert File.exist?(filename)
|
||||
ActiveRecord::Tasks::DatabaseTasks.structure_dump(@configuration, @filename)
|
||||
end
|
||||
|
||||
def test_structure_dump_with_schema_search_path
|
||||
@configuration['schema_search_path'] = 'foo,bar'
|
||||
|
||||
Kernel.expects(:system).with("pg_dump -i -s -x -O -f #{@filename} --schema=foo --schema=bar my-app-db").returns(true)
|
||||
|
||||
ActiveRecord::Tasks::DatabaseTasks.structure_dump(@configuration, @filename)
|
||||
end
|
||||
|
||||
def test_structure_dump_with_schema_search_path_and_dump_schemas_all
|
||||
@configuration['schema_search_path'] = 'foo,bar'
|
||||
|
||||
Kernel.expects(:system).with("pg_dump -i -s -x -O -f #{@filename} my-app-db").returns(true)
|
||||
|
||||
with_dump_schemas(:all) do
|
||||
ActiveRecord::Tasks::DatabaseTasks.structure_dump(@configuration, @filename)
|
||||
end
|
||||
end
|
||||
|
||||
def test_structure_dump_with_dump_schemas_string
|
||||
Kernel.expects(:system).with("pg_dump -i -s -x -O -f #{@filename} --schema=foo --schema=bar my-app-db").returns(true)
|
||||
|
||||
with_dump_schemas('foo,bar') do
|
||||
ActiveRecord::Tasks::DatabaseTasks.structure_dump(@configuration, @filename)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def with_dump_schemas(value, &block)
|
||||
old_dump_schemas = ActiveRecord::Base.dump_schemas
|
||||
ActiveRecord::Base.dump_schemas = value
|
||||
yield
|
||||
ensure
|
||||
FileUtils.rm(filename)
|
||||
ActiveRecord::Base.dump_schemas = old_dump_schemas
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -302,6 +302,11 @@ All these configuration options are delegated to the `I18n` library.
|
|||
`config/environments/production.rb` which is generated by Rails. The
|
||||
default value is true if this configuration is not set.
|
||||
|
||||
* `config.active_record.dump_schemas` controls which database schemas will be dumped when calling db:structure:dump.
|
||||
The options are `:schema_search_path` (the default) which dumps any schemas listed in schema_search_path,
|
||||
`:all` which always dumps all schemas regardless of the schema_search_path,
|
||||
or a string of comma separated schemas.
|
||||
|
||||
* `config.active_record.belongs_to_required_by_default` is a boolean value and controls whether `belongs_to` association is required by default.
|
||||
|
||||
The MySQL adapter adds one additional configuration option:
|
||||
|
|
Loading…
Reference in a new issue