mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Merge pull request #38770 from eileencodes/fix-db-rollback-rake-tasks
Handle db:rollback and db:rollback:[NAME] for multi-db apps
This commit is contained in:
commit
8220cc9cba
3 changed files with 77 additions and 0 deletions
|
@ -1,3 +1,9 @@
|
|||
* Add support for `db:rollback:name` for multiple database applications.
|
||||
|
||||
Multiple database applications will now raise if `db:rollback` is call and recommend using the `db:rollback:[NAME]` to rollback migrations.
|
||||
|
||||
*Eileen M. Uchitelle*
|
||||
|
||||
* `Relation#pick` now uses already loaded results instead of making another query.
|
||||
|
||||
*Eugene Kenny*
|
||||
|
|
|
@ -243,10 +243,28 @@ db_namespace = namespace :db do
|
|||
end
|
||||
end
|
||||
|
||||
namespace :rollback do
|
||||
ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
|
||||
task name => :load_config do
|
||||
step = ENV["STEP"] ? ENV["STEP"].to_i : 1
|
||||
db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, name: name)
|
||||
|
||||
ActiveRecord::Base.establish_connection(db_config)
|
||||
ActiveRecord::Base.connection.migration_context.rollback(step)
|
||||
|
||||
db_namespace["_dump"].invoke
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
desc "Rolls the schema back to the previous version (specify steps w/ STEP=n)."
|
||||
task rollback: :load_config do
|
||||
ActiveRecord::Tasks::DatabaseTasks.raise_for_multi_db(command: "db:migrate:rollback")
|
||||
|
||||
step = ENV["STEP"] ? ENV["STEP"].to_i : 1
|
||||
|
||||
ActiveRecord::Base.connection.migration_context.rollback(step)
|
||||
|
||||
db_namespace["_dump"].invoke
|
||||
end
|
||||
|
||||
|
|
|
@ -281,6 +281,31 @@ module ApplicationTests
|
|||
end
|
||||
end
|
||||
|
||||
def db_migrate_and_rollback(namespace = nil)
|
||||
Dir.chdir(app_path) do
|
||||
generate_models_for_animals
|
||||
rails("db:migrate")
|
||||
|
||||
if namespace
|
||||
rollback_output = rails("db:rollback:#{namespace}")
|
||||
else
|
||||
assert_raises RuntimeError, /You're using a multiple database application/ do
|
||||
rollback_output = rails("db:rollback")
|
||||
end
|
||||
end
|
||||
|
||||
case namespace
|
||||
when "primary"
|
||||
assert_no_match(/OneMigration: reverted/, rollback_output)
|
||||
assert_match(/CreateBooks: reverted/, rollback_output)
|
||||
when nil
|
||||
else
|
||||
assert_no_match(/TwoMigration: reverted/, rollback_output)
|
||||
assert_match(/CreateDogs: reverted/, rollback_output)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def db_prepare
|
||||
Dir.chdir(app_path) do
|
||||
generate_models_for_animals
|
||||
|
@ -480,6 +505,34 @@ module ApplicationTests
|
|||
db_up_and_down "02", "animals"
|
||||
end
|
||||
|
||||
test "db:rollback raises on a multi-db application" do
|
||||
require "#{app_path}/config/environment"
|
||||
|
||||
app_file "db/migrate/01_one_migration.rb", <<-MIGRATION
|
||||
class OneMigration < ActiveRecord::Migration::Current
|
||||
end
|
||||
MIGRATION
|
||||
|
||||
db_migrate_and_rollback
|
||||
end
|
||||
|
||||
test "db:rollback:namespace works" do
|
||||
require "#{app_path}/config/environment"
|
||||
|
||||
app_file "db/migrate/01_one_migration.rb", <<-MIGRATION
|
||||
class OneMigration < ActiveRecord::Migration::Current
|
||||
end
|
||||
MIGRATION
|
||||
|
||||
app_file "db/animals_migrate/02_two_migration.rb", <<-MIGRATION
|
||||
class TwoMigration < ActiveRecord::Migration::Current
|
||||
end
|
||||
MIGRATION
|
||||
|
||||
db_migrate_and_rollback "primary"
|
||||
db_migrate_and_rollback "animals"
|
||||
end
|
||||
|
||||
test "db:migrate:status works on all databases" do
|
||||
require "#{app_path}/config/environment"
|
||||
db_migrate_and_migrate_status
|
||||
|
|
Loading…
Reference in a new issue