首页 文章

如何回滚特定的迁移?

提问于
浏览
658

我有以下迁移文件 db\migrate\20100905201547_create_blocks.rb

如何专门回滚该迁移文件?

13 回答

  • 3

    要回滚上次迁移,您可以执行以下操作:

    rake db:rollback
    

    如果要使用版本回滚特定迁移,则应执行以下操作:

    rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION
    

    对于例如如果版本是20141201122027,您将执行以下操作:

    rake db:migrate:down VERSION=20141201122027
    

    回滚特定的迁移 .

  • 1

    在rails 5中,rake db:migrate:status或rails db:migrate:status非常简单

    它被修改为以相同的方式处理然后只选择要回滚的版本,然后运行rake db:migrate VERSION = 2013424230423

    确保VERSION全是大写字母

    如果您在迁移的任何步骤中遇到问题或卡在中间,只需转到迁移文件并注释掉已迁移的行 .

    希望有所帮助

  • 21

    迁移使用该命令更改数据库的状态

    $ bundle exec rake db:migrate
    

    我们可以使用撤消单个迁移步骤

    $ bundle exec rake db:rollback
    

    要一直回到开头,我们可以使用

    $ bundle exec rake db:migrate VERSION=0
    

    正如您可能猜到的那样,将任何其他数字替换为0会迁移到该版本号,其中版本号来自按顺序列出迁移

  • 6

    回滚上次迁移:

    # rails < 5.0
    rake db:rollback
    
    # rails >= 5.0
    rake db:rollback
    # or
    rails db:rollback
    

    回滚最后 n 次迁移

    # rails < 5.0
    rake db:rollback STEP=2
    
    # rails >= 5.0
    rake db:rollback STEP=2
    # or
    rails db:rollback STEP=2
    

    回滚特定的迁移

    # rails < 5.0
    rake db:migrate:down VERSION=20100905201547
    
    # rails >= 5.0
    rake db:migrate:down VERSION=20100905201547
    # or
    rails db:migrate:down VERSION=20100905201547
    
  • 24

    rake db:migrate:down VERSION=your_migrations's_version_number_here

    版本是迁移文件名的数字前缀

    How to find version

    您的迁移文件存储在 rails_root/db/migrate 目录中 . 找到要回滚的相应文件并复制前缀编号 .

    例如

    文件名: 20140208031131_create_roles.rb 那么版本是 20140208031131

  • 45

    您可以使用带有不同选项的 rake db:rollback 来回滚迁移 .

    但是,根据您的要求,语法已经改变 .

    如果要回滚上次迁移,则可以使用它 .

    rake db:rollback
    

    要么

    rake db:rollback STEP=1
    

    如果您想要一次性回滚迁移次数,那么您只需传递参数

    rake db:rollback STEP=n
    

    其中 n 是从最新迁移回滚的迁移数 .

    如果要回滚特定迁移,则应在下一语法中传递迁移版本 .

    rake db:migrate:down VERSION=xxxxx
    

    其中xxxxx是迁移的版本号 .

  • 1048

    如果它是可逆迁移并且最后一个已执行,则运行 rake db:rollback . 而且你总是可以使用版本 . 例如

    迁移文件是20140716084539_create_customer_stats.rb,因此rollback命令将为 rake db:migrate:down VERSION=20140716084539

  • 813
    rake db:migrate:down VERSION=20100905201547
    

    将回滚特定文件 .


    要查找所有迁移的版本,可以使用以下命令:

    rake db:migrate:status
    

    或者,只是迁移文件名的前缀是您需要回滚的版本 .


    有关迁移的信息,请参阅the Ruby on Rails guide entry .

  • 13

    如果要回滚和迁移,可以运行:

    rake db:migrate:redo
    

    这与以下相同:

    rake db:rollback
    rake db:migrate
    
  • 3

    要回滚上次迁移,您可以执行以下操作:

    rake db:rollback
    

    如果要使用版本回滚特定迁移,则应执行以下操作:

    rake db:migrate:down VERSION=YOUR_MIGRATION_VERSION
    

    如果要回滚的迁移文件名为 db/migrate/20141201122027_create_some_table.rb ,则该迁移的VERSION为 20141201122027 ,这是创建该迁移的时间戳,并且回滚该迁移的命令将为:

    rake db:migrate:down VERSION=20141201122027
    
  • 12

    Rails Guide

    还原以前的迁移

    您可以使用Active Record的功能使用 revert 方法回滚迁移:

    require_relative '20100905201547_create_blocks'
    
    class FixupCreateBlock < ActiveRecord::Migration
      def change
        revert CreateBlock
    
        create_table(:apples) do |t|
          t.string :variety
        end
      end
    end
    

    revert 方法还接受一个反转指令块 . 这可以用于还原先前迁移的选定部分 . 例如,让我们假设CreateBlock已提交,后来决定最好使用Active Record验证代替CHECK约束来验证zipcode .

    class DontUseConstraintForZipcodeValidationMigration < ActiveRecord::Migration
          def change
            revert do
              # copy-pasted code from CreateBlock
              reversible do |dir|
                dir.up do
                  # add a CHECK constraint
                  execute <<-SQL
                    ALTER TABLE distributors
                      ADD CONSTRAINT zipchk
                        CHECK (char_length(zipcode) = 5);
                  SQL
                end
                dir.down do
                  execute <<-SQL
                    ALTER TABLE distributors
                      DROP CONSTRAINT zipchk
                  SQL
                end
              end
    
              # The rest of the migration was ok
            end
          end
        end
    

    也可以在不使用revert的情况下编写相同的迁移,但这将涉及更多步骤:颠倒create_table的顺序和可逆,用drop_table替换create_table,最后用down替换,反之亦然 . 这都是通过还原来处理的 .

  • 2

    要回滚 all migrations up to a particular version (例如 20181002222222 ),请使用:

    rake db:migrate VERSION=20181002222222
    

    (请注意,这使用 db:migrate - 而不是 db:migrate:down ,就像在这个问题的其他答案中一样 . )

    假设指定的迁移版本早于当前版本,这将回滚所有迁移,但不包括指定的版本 .

    例如,如果 rake db:migrate:status 最初显示:

    (... some older migrations ...)
      up      20181001002039  Some migration description
      up      20181002222222  Some migration description
      up      20181003171932  Some migration description
      up      20181004211151  Some migration description
      up      20181005151403  Some migration description
    

    运行:

    rake db:migrate VERSION=20181002222222
    

    将导致:

    (... some older migrations ...)
      up      20181001002039  Some migration description
      up      20181002222222  Some migration description
      down    20181003171932  Some migration description
      down    20181004211151  Some migration description
      down    20181005151403  Some migration description
    

    参考:https://makandracards.com/makandra/845-migrate-or-revert-only-some-migrations

  • 0
    rake db:rollback STEP=1
    

    如果要回滚的迁移是最后一次应用,则可以使用此方法 . 您可以将1替换为您想要返回的许多迁移 .

    例如:

    rake db:rollback STEP=5
    

    还将回滚稍后发生的所有迁移(4,3,2和1) .

    正如评论中所建议:

    为了回滚特定的迁移用途:

    rake db:migrate:down VERSION=20100905201547
    

相关问题