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:
Ryan Wallace 2015-03-15 16:03:56 -07:00
parent 80f66d405c
commit 7ab36f4532
5 changed files with 69 additions and 7 deletions

View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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: