Skip to content

Commit 97ff46c

Browse files
authored
Merge pull request rails#42804 from eileencodes/rebased-39326
Add option to disable schema dumb per-database
2 parents a39098d + 10ca60a commit 97ff46c

File tree

6 files changed

+191
-3
lines changed

6 files changed

+191
-3
lines changed

activerecord/CHANGELOG.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,17 @@
1+
* Add option to disable schema dumb per-database
2+
3+
Dumping the schema is on by default for all databases in an application. To turn it off for a
4+
specific database use the `schema_dump` option:
5+
6+
```yaml
7+
# config/database.yml
8+
9+
production:
10+
schema_dump: false
11+
```
12+
13+
*Luis Vasconcellos*, *Eileen M. Uchitelle*
14+
115
* Fix `eager_loading?` when ordering with `Hash` syntax
216

317
`eager_loading?` is triggered correctly when using `order` with hash syntax

activerecord/lib/active_record/database_configurations/hash_config.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class DatabaseConfigurations
2626
# connections.
2727
class HashConfig < DatabaseConfig
2828
attr_reader :configuration_hash
29+
2930
def initialize(env_name, name, configuration_hash)
3031
super(env_name, name)
3132
@configuration_hash = configuration_hash.symbolize_keys.freeze
@@ -103,6 +104,11 @@ def adapter
103104
def schema_cache_path
104105
configuration_hash[:schema_cache_path]
105106
end
107+
108+
# Determines whether to dump the schema for a database.
109+
def schema_dump
110+
configuration_hash.fetch(:schema_dump, true)
111+
end
106112
end
107113
end
108114
end

activerecord/lib/active_record/railties/databases.rake

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,9 +121,13 @@ db_namespace = namespace :db do
121121
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
122122
# IMPORTANT: This task won't dump the schema if ActiveRecord.dump_schema_after_migration is set to false
123123
task name do
124-
if ActiveRecord.dump_schema_after_migration
124+
db_config = ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env, name: name)
125+
126+
if ActiveRecord.dump_schema_after_migration && db_config.schema_dump
127+
ActiveRecord::Base.establish_connection(db_config)
125128
db_namespace["schema:dump:#{name}"].invoke
126129
end
130+
127131
# Allow this task to be called as many times as required. An example is the
128132
# migrate:redo task, which calls other two internally that depend on this one.
129133
db_namespace["_dump:#{name}"].reenable
@@ -433,8 +437,10 @@ db_namespace = namespace :db do
433437
desc "Creates a database schema file (either db/schema.rb or db/structure.sql, depending on `config.active_record.schema_format`)"
434438
task dump: :load_config do
435439
ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env).each do |db_config|
436-
ActiveRecord::Base.establish_connection(db_config)
437-
ActiveRecord::Tasks::DatabaseTasks.dump_schema(db_config)
440+
if db_config.schema_dump
441+
ActiveRecord::Base.establish_connection(db_config)
442+
ActiveRecord::Tasks::DatabaseTasks.dump_schema(db_config)
443+
end
438444
end
439445

440446
db_namespace["schema:dump"].reenable

activerecord/test/cases/database_configurations/hash_config_test.rb

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,26 @@ def test_idle_timeout_nil_when_less_than_or_equal_to_zero
102102
config = HashConfig.new("default_env", "primary", idle_timeout: "0")
103103
assert_nil config.idle_timeout
104104
end
105+
106+
def test_default_schema_dump_value
107+
config = HashConfig.new("default_env", "primary", {})
108+
assert_equal true, config.schema_dump
109+
end
110+
111+
def test_schema_dump_value_set_to_true
112+
config = HashConfig.new("default_env", "primary", { schema_dump: true })
113+
assert_equal true, config.schema_dump
114+
end
115+
116+
def test_schema_dump_value_set_to_nil
117+
config = HashConfig.new("default_env", "primary", { schema_dump: nil })
118+
assert_nil config.schema_dump
119+
end
120+
121+
def test_schema_dump_value_set_to_false
122+
config = HashConfig.new("default_env", "primary", { schema_dump: false })
123+
assert_equal false, config.schema_dump
124+
end
105125
end
106126
end
107127
end

railties/test/application/rake/migrations_test.rb

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,42 @@ class TwoMigration < ActiveRecord::Migration::Current
425425
assert_match(/up\s+002\s+Two migration/, output)
426426
end
427427

428+
test "schema generation when dump_schema_after_migration and schema_dump are true" do
429+
add_to_config("config.active_record.dump_schema_after_migration = true")
430+
431+
app_file "config/database.yml", <<~EOS
432+
development:
433+
adapter: sqlite3
434+
database: 'dev_db'
435+
schema_dump: true
436+
EOS
437+
438+
Dir.chdir(app_path) do
439+
rails "generate", "model", "book", "title:string"
440+
rails "db:migrate"
441+
442+
assert File.exist?("db/schema.rb"), "should dump schema when configured to"
443+
end
444+
end
445+
446+
test "schema generation when dump_schema_after_migration is true schema_dump is false" do
447+
add_to_config("config.active_record.dump_schema_after_migration = true")
448+
449+
app_file "config/database.yml", <<~EOS
450+
development:
451+
adapter: sqlite3
452+
database: 'dev_db'
453+
schema_dump: false
454+
EOS
455+
456+
Dir.chdir(app_path) do
457+
rails "generate", "model", "book", "title:string"
458+
rails "db:migrate"
459+
460+
assert_not File.exist?("db/schema.rb"), "should not dump schema when configured not to"
461+
end
462+
end
463+
428464
test "schema generation when dump_schema_after_migration is set" do
429465
add_to_config("config.active_record.dump_schema_after_migration = false")
430466

railties/test/application/rake/multi_dbs_test.rb

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -812,6 +812,112 @@ class TwoMigration < ActiveRecord::Migration::Current
812812
db_create_and_drop_namespace("primary", "db/development.sqlite3")
813813
end
814814

815+
test "schema generation when dump_schema_after_migration is true schema_dump is false" do
816+
app_file "config/database.yml", <<~EOS
817+
development:
818+
primary:
819+
adapter: sqlite3
820+
database: dev_db
821+
schema_dump: false
822+
secondary:
823+
adapter: sqlite3
824+
database: secondary_dev_db
825+
schema_dump: false
826+
EOS
827+
828+
Dir.chdir(app_path) do
829+
rails "generate", "model", "book", "title:string"
830+
rails "db:migrate"
831+
832+
assert_not File.exist?("db/schema.rb"), "should not dump schema when configured not to"
833+
assert_not File.exist?("db/secondary_schema.rb"), "should not dump schema when configured not to"
834+
end
835+
end
836+
837+
test "schema generation when dump_schema_after_migration is false and schema_dump is true" do
838+
add_to_config("config.active_record.dump_schema_after_migration = false")
839+
840+
app_file "config/database.yml", <<~EOS
841+
development:
842+
primary:
843+
adapter: sqlite3
844+
database: dev_db
845+
secondary:
846+
adapter: sqlite3
847+
database: secondary_dev_db
848+
EOS
849+
850+
Dir.chdir(app_path) do
851+
rails "generate", "model", "book", "title:string"
852+
rails "db:migrate"
853+
854+
assert_not File.exist?("db/schema.rb"), "should not dump schema when configured not to"
855+
assert_not File.exist?("db/secondary_schema.rb"), "should not dump schema when configured not to"
856+
end
857+
end
858+
859+
test "schema generation with schema dump only for primary" do
860+
app_file "config/database.yml", <<~EOS
861+
development:
862+
primary:
863+
adapter: sqlite3
864+
database: primary_dev_db
865+
secondary:
866+
adapter: sqlite3
867+
database: secondary_dev_db
868+
schema_dump: false
869+
EOS
870+
871+
Dir.chdir(app_path) do
872+
rails "generate", "model", "book", "title:string"
873+
rails "db:migrate:primary", "db:migrate:secondary"
874+
875+
assert File.exist?("db/schema.rb"), "should not dump schema when configured not to"
876+
assert_not File.exist?("db/secondary_schema.rb"), "should not dump schema when configured not to"
877+
end
878+
end
879+
880+
test "schema generation with schema dump only for secondary" do
881+
app_file "config/database.yml", <<~EOS
882+
development:
883+
primary:
884+
adapter: sqlite3
885+
database: primary_dev_db
886+
schema_dump: false
887+
secondary:
888+
adapter: sqlite3
889+
database: secondary_dev_db
890+
EOS
891+
892+
Dir.chdir(app_path) do
893+
rails "generate", "model", "book", "title:string"
894+
rails "db:migrate:primary", "db:migrate:secondary"
895+
896+
assert_not File.exist?("db/schema.rb"), "should not dump schema when configured not to"
897+
assert File.exist?("db/secondary_schema.rb"), "should dump schema when configured to"
898+
end
899+
end
900+
901+
test "schema generation when dump_schema_after_migration and schema_dump are true" do
902+
app_file "config/database.yml", <<~EOS
903+
development:
904+
primary:
905+
adapter: sqlite3
906+
database: dev_db
907+
secondary:
908+
adapter: sqlite3
909+
database: secondary_dev_db
910+
EOS
911+
912+
Dir.chdir(app_path) do
913+
rails "generate", "model", "book", "title:string"
914+
rails "db:migrate"
915+
916+
assert File.exist?("db/schema.rb"), "should dump schema when configured to"
917+
assert File.exist?("db/secondary_schema.rb"), "should dump schema when configured to"
918+
end
919+
end
920+
815921
test "db:create and db:drop don't raise errors when loading YAML containing multiple ERB statements on the same line" do
816922
app_file "config/database.yml", <<-YAML
817923
development:

0 commit comments

Comments
 (0)