Ruby on Rails: 如何使用rake db:migrate撤销迁移?

103
在安装了Devise模型用户后,我得到了这个结果。
class DeviseCreateUsers < ActiveRecord::Migration
  def self.up
    create_table(:users) do |t|
      t.database_authenticatable :null => false
      t.recoverable
      t.rememberable
      t.trackable

      # t.encryptable
      # t.confirmable
      # t.lockable :lock_strategy => :failed_attempts, :unlock_strategy => :both
      # t.token_authenticatable


      t.timestamps
    end

    add_index :users, :email,                :unique => true
    add_index :users, :reset_password_token, :unique => true
    # add_index :users, :confirmation_token,   :unique => true
    # add_index :users, :unlock_token,         :unique => true
    # add_index :users, :authentication_token, :unique => true
  end

  def self.down
    drop_table :users
  end
end

现在如果我运行 rake db:migrate 命令,用户表将会被创建。
我该如何回滚这个迁移,也就是说,我该如何再次使用 rake 删除用户表?
9个回答

157

运行以下命令

rake db:migrate:down VERSION=<version>

在这里<version>是您想要还原的迁移文件的版本号。

例如,如果您想还原名为3846656238_create_users.rb的迁移,则运行以下命令:

rake db:migrate:down VERSION=3846656238


我遇到了一个 UnknownMigrationVersionError 错误,但我发现这是因为我的迁移文件在 db/migrate/main 目录下,有没有人知道如何解决这个问题,让 db:migrate:down 命令查找该特定目录或其子目录中的迁移文件? - tf.rz
这只适用于Rails 3及以上版本。我的生活还停留在Rails 2。太遗憾了。 - morhook
@morhook 这也适用于 Rails 3。在这里查看文档 https://guides.rubyonrails.org/v3.2/migrations.html - Mahesh
你是对的!它适用于Rails 2和Rails 3。感谢@Mahesh的贡献! - morhook

117

只需运行此命令:

rake db:rollback

68
我相信有三种可用的选项来回滚迁移(它们也有重叠):
  1. 回滚 最近的 迁移:
  2. rake db:migrate:down # 仅适用于 Rails 2。

  3. 回滚 n个 最近的迁移:
  4. rake db:rollback STEP=n

  5. 回滚到一个以前的、特定的版本:
  6. $ rake db:migrate:down VERSION=nnn # Rails 3(还需提供版本号)。

版本号是提交的SHA(Secure Hash Algorithm),是一个长的16进制数字,看起来像886af3194768917c78e... 您可以通过执行git log来查看。
您可以使用rake -T db:命令查看这些命令(和其他命令)及其描述,对于 Rails 3.2,它包括:
rake db:migrate         # Migrate the database (options: VERSION=x, VERBOSE=false)
rake db:migrate:status  # Display status of migrations
rake db:rollback        # Rolls the schema back to the previous version (specify steps w/ STEP=n)

5
滚动到特定版本:rake db:migrate VERSION=<版本号>。其中,"VERSION"表示要迁移的数据库版本号。 - Ajedi32
3
至少对于Rails 3.0.20来说,第一条命令是错误的。执行单个 rake db:migrate:down 命令会中止,并显示错误消息 "VERSION is required"。然而,推荐的 rake db:rollback 命令可以正常工作。 - martin
正如答案中详细说明的那样,Rails 2仅适用于第一个命令。 - Michael Durrant
1
环境变量是区分大小写的,因此应该是 STEPVERSION - Kostas Rousis
澄清一下,$ rake db:migrate:down VERSION=nnn 不会回滚到某个版本,它是向下迁移指定的版本。 - johnml

16

您可以执行回滚并指定要回滚的最后迁移数量,例如:

rake db:rollback STEP=3

获取最近3个迁移。


这是一个更快更简单的方法,如果您想撤销最近的几个迁移,而不是查找版本号。 - Pre-alpha

11
作为一名新的程序员(或其他新的程序员),rake db:rollback 有时候只能起到一半作用,所以你可以从这里开始。如果不能,那么就用 rake db:migrate:down VERSION=3846656238 命令,并将“VERSION”替换为你想要回滚的迁移文件的版本号即可。请保留所有HTML标签。

10
rake db:migrate:redo

它将撤销并重新应用最后一次迁移。


5

在Rails 5中,我们可以使用rails命令而不是rake

rails db:migrate:down VERSION=<version>

示例

使用“rails db:migrate:down VERSION=20170330090327”命令


3
在您的终端中运行以下命令:
rake db:migrate:status

或者
bundle exec rake db:migrate:status

这个页面展示了我们之前运行的所有迁移的状态、迁移ID和迁移名称。选择您的迁移ID(即您的版本号),并在以下命令中将该ID放在version=之后,然后按Enter键。

bundle exec rake db:migrate:down VERSION=

1

如何回滚迁移

另一种方法。我更喜欢这种方法,因为你需要明确指出,而不是回滚 - 以防万一你可能会犯错误。

(1)首先确定迁移ID

rake db:migrate:status

  • 复制ID号码。

Identify the migration to roll back.

(2) 然后回滚迁移

rake db:migrate:down VERSION=20190802023239

  • 将相关的ID号码粘贴到上面。当然,在你的情况下,迁移ID将会不同!

.......现在您就可以开始了!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接