Skip to content

Commit ca6d15b

Browse files
authored
Merge pull request rails#44834 from ghiculescu/schema-dump-env
`rails db:schema:{dump,load}` now checks `ENV["SCHEMA_FORMAT"]` before config
2 parents bb4a8a9 + d5fc7da commit ca6d15b

File tree

3 files changed

+61
-13
lines changed

3 files changed

+61
-13
lines changed

activerecord/CHANGELOG.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,15 @@
1+
* `rails db:schema:{dump,load}` now checks `ENV["SCHEMA_FORMAT"]` before config
2+
3+
Since `rails db:structure:{dump,load}` was deprecated there wasn't a simple
4+
way to dump a schema to both SQL and Ruby formats. You can now do this with
5+
an environment variable. For example:
6+
7+
```
8+
SCHEMA_FORMAT=sql rake db:schema:dump
9+
```
10+
11+
*Alex Ghiculescu*
12+
113
* Fixed MariaDB default function support.
214
315
Defaults would be written wrong in "db/schema.rb" and not work correctly

activerecord/lib/active_record/railties/databases.rake

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -452,42 +452,45 @@ db_namespace = namespace :db do
452452
end
453453

454454
namespace :schema do
455-
desc "Creates a database schema file (either db/schema.rb or db/structure.sql, depending on `config.active_record.schema_format`)"
455+
desc "Creates a database schema file (either db/schema.rb or db/structure.sql, depending on `ENV['SCHEMA_FORMAT']` or `config.active_record.schema_format`)"
456456
task dump: :load_config do
457457
ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env).each do |db_config|
458458
if db_config.schema_dump
459459
ActiveRecord::Base.establish_connection(db_config)
460-
ActiveRecord::Tasks::DatabaseTasks.dump_schema(db_config)
460+
schema_format = ENV.fetch("SCHEMA_FORMAT", ActiveRecord.schema_format).to_sym
461+
ActiveRecord::Tasks::DatabaseTasks.dump_schema(db_config, schema_format)
461462
end
462463
end
463464

464465
db_namespace["schema:dump"].reenable
465466
end
466467

467-
desc "Loads a database schema file (either db/schema.rb or db/structure.sql, depending on `config.active_record.schema_format`) into the database"
468+
desc "Loads a database schema file (either db/schema.rb or db/structure.sql, depending on `ENV['SCHEMA_FORMAT']` or `config.active_record.schema_format`) into the database"
468469
task load: [:load_config, :check_protected_environments] do
469470
ActiveRecord::Tasks::DatabaseTasks.load_schema_current(ActiveRecord.schema_format, ENV["SCHEMA"])
470471
end
471472

472473
namespace :dump do
473474
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
474-
desc "Creates a database schema file (either db/schema.rb or db/structure.sql, depending on `config.active_record.schema_format`) for #{name} database"
475+
desc "Creates a database schema file (either db/schema.rb or db/structure.sql, depending on `ENV['SCHEMA_FORMAT']` or `config.active_record.schema_format`) for #{name} database"
475476
task name => :load_config do
476477
db_config = ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env, name: name)
477478
ActiveRecord::Base.establish_connection(db_config)
478-
ActiveRecord::Tasks::DatabaseTasks.dump_schema(db_config)
479+
schema_format = ENV.fetch("SCHEMA_FORMAT", ActiveRecord.schema_format).to_sym
480+
ActiveRecord::Tasks::DatabaseTasks.dump_schema(db_config, schema_format)
479481
db_namespace["schema:dump:#{name}"].reenable
480482
end
481483
end
482484
end
483485

484486
namespace :load do
485487
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
486-
desc "Loads a database schema file (either db/schema.rb or db/structure.sql, depending on `config.active_record.schema_format`) into the #{name} database"
488+
desc "Loads a database schema file (either db/schema.rb or db/structure.sql, depending on `ENV['SCHEMA_FORMAT']` or `config.active_record.schema_format`) into the #{name} database"
487489
task name => [:load_config, :check_protected_environments] do
488490
original_db_config = ActiveRecord::Base.connection_db_config
489491
db_config = ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env, name: name)
490-
ActiveRecord::Tasks::DatabaseTasks.load_schema(db_config)
492+
schema_format = ENV.fetch("SCHEMA_FORMAT", ActiveRecord.schema_format).to_sym
493+
ActiveRecord::Tasks::DatabaseTasks.load_schema(db_config, schema_format)
491494
ensure
492495
ActiveRecord::Base.establish_connection(original_db_config) if original_db_config
493496
end
@@ -545,12 +548,13 @@ db_namespace = namespace :db do
545548
db_namespace["test:load_schema"].invoke
546549
end
547550

548-
# desc "Recreate the test database from an existent schema file (schema.rb or structure.sql, depending on `config.active_record.schema_format`)"
551+
# desc "Recreate the test database from an existent schema file (schema.rb or structure.sql, depending on `ENV['SCHEMA_FORMAT']` or `config.active_record.schema_format`)"
549552
task load_schema: %w(db:test:purge) do
550553
should_reconnect = ActiveRecord::Base.connection_pool.active_connection?
551554
ActiveRecord::Schema.verbose = false
552555
ActiveRecord::Base.configurations.configs_for(env_name: "test").each do |db_config|
553-
ActiveRecord::Tasks::DatabaseTasks.load_schema(db_config)
556+
schema_format = ENV.fetch("SCHEMA_FORMAT", ActiveRecord.schema_format).to_sym
557+
ActiveRecord::Tasks::DatabaseTasks.load_schema(db_config, schema_format)
554558
end
555559
ensure
556560
if should_reconnect
@@ -586,7 +590,8 @@ db_namespace = namespace :db do
586590
should_reconnect = ActiveRecord::Base.connection_pool.active_connection?
587591
ActiveRecord::Schema.verbose = false
588592
db_config = ActiveRecord::Base.configurations.configs_for(env_name: "test", name: name)
589-
ActiveRecord::Tasks::DatabaseTasks.load_schema(db_config)
593+
schema_format = ENV.fetch("SCHEMA_FORMAT", ActiveRecord.schema_format).to_sym
594+
ActiveRecord::Tasks::DatabaseTasks.load_schema(db_config, schema_format)
590595
ensure
591596
if should_reconnect
592597
ActiveRecord::Base.establish_connection(ActiveRecord::Tasks::DatabaseTasks.env.to_sym)

railties/test/application/rake/dbs_test.rb

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,15 @@ def db_schema_dump
352352
end
353353
end
354354

355+
def db_schema_sql_dump
356+
Dir.chdir(app_path) do
357+
args = ["generate", "model", "book", "title:string"]
358+
rails args
359+
rails "db:migrate", "db:schema:dump"
360+
assert_match(/CREATE TABLE/, File.read("db/structure.sql"))
361+
end
362+
end
363+
355364
test "db:schema:dump without database_url" do
356365
db_schema_dump
357366
end
@@ -361,7 +370,29 @@ def db_schema_dump
361370
db_schema_dump
362371
end
363372

364-
def db_schema_cache_dump(filename = "db/schema_cache.yml")
373+
test "db:schema:dump with env as ruby" do
374+
add_to_config "config.active_record.schema_format = :sql"
375+
376+
old_env = ENV["SCHEMA_FORMAT"]
377+
ENV["SCHEMA_FORMAT"] = "ruby"
378+
379+
db_schema_dump
380+
ensure
381+
ENV["SCHEMA_FORMAT"] = old_env
382+
end
383+
384+
test "db:schema:dump with env as sql" do
385+
add_to_config "config.active_record.schema_format = :ruby"
386+
387+
old_env = ENV["SCHEMA_FORMAT"]
388+
ENV["SCHEMA_FORMAT"] = "sql"
389+
390+
db_schema_sql_dump
391+
ensure
392+
ENV["SCHEMA_FORMAT"] = old_env
393+
end
394+
395+
def db_schema_cache_dump
365396
Dir.chdir(app_path) do
366397
rails "db:schema:cache:dump"
367398

@@ -398,7 +429,7 @@ def db_schema_cache_dump(filename = "db/schema_cache.yml")
398429
end
399430

400431
db_schema_dump
401-
db_schema_cache_dump("db/special_schema_cache.yml")
432+
db_schema_cache_dump
402433
end
403434

404435
test "db:schema:cache:dump custom env" do
@@ -407,7 +438,7 @@ def db_schema_cache_dump(filename = "db/schema_cache.yml")
407438
ENV["SCHEMA_CACHE"] = filename
408439

409440
db_schema_dump
410-
db_schema_cache_dump(filename)
441+
db_schema_cache_dump
411442
ensure
412443
ENV["SCHEMA_CACHE"] = @old_schema_cache_env
413444
end

0 commit comments

Comments
 (0)