Ruby on Rails:如何使用rake db:migrate还原迁移?


94

安装devise MODEL User之后,我得到了这个。

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

现在,如果我使用db:migrate,将创建users表。

如何恢复此迁移,即如何再次使用rake删除用户表?

Answers:


147

运行以下命令

rake db:migrate:down VERSION=<version>

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

例如。如果要还原文件名为3846656238_create_users.rb的迁移

耙db:migrate:down VERSION = 3846656238


我得到一个,UnknownMigrationVersionError但我发现这是因为我的迁移位于内部db/migrate/main,有人知道db:migrate:down在该特定目录或迁移子目录中查找该问题的解决方法吗?
tf.rz

这仅适用于3或更高版本的导轨。我的生活
陷入困境

@morhook这也适用于rails 3。在此处查看文档guides.rubyonrails.org/v3.2/migrations.html
Mahesh,

你是对的!它适用于导轨2和导轨3。感谢@Mahesh的输入!
morhook


65

我相信可以使用三种方法来恢复迁移(它们也有重叠):

  1. 向下滚动最近的迁移:

    rake db:migrate:down #仅Rails 2。

  2. 滚下来的数(n)最近的迁移:

    rake db:rollback STEP=n

  3. 向下滚动以前的特定版本:

    $ rake db:migrate:down VERSION=nnn #Rails 3(也提供版本号)。

版本号表示提交的SHA(安全哈希算法),它是一个长十六进制数,看起来像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 number>
Ajedi32

3
至少对于Rails 3.0.20,第一个命令是错误的。单个rake db:migrate:down中止并显示错误消息“需要版本”。该建议 rake db:rollback然而工作。
马丁

如答案中所述,Rails 2仅用于第一个命令。
Michael Durrant 2014年

1
环境变量区分大小写,因此应该STEPVERSION
Kostas Rousis 2014年

为了澄清起见,$ rake db:migrate:down VERSION=nnn它不会向下滚动一个版本,而是向下迁移指定版本。
johnml '16

15

您可以进行回滚并指定将回滚多少次最近的迁移,例如

rake db:rollback STEP=3

最后3次迁移。


如果您要撤消最近的迁移,这是一种更快,更轻松的方法,而不是查找版本号
的Alpha版本

11

作为新程序员(或其他新程序员)

rake db:rollback工作约一半的时间。我从这里开始。

如果不, rake db:migrate:down VERSION=3846656238

在VERSION中插入要还原的迁移文件的版本号。


10
rake db:migrate:redo

它将撤消并重新应用上一次迁移。



2

在终端中运行以下命令:

rake db:migrate:status

要么

bundle exec rake db:migrate:status

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

bundle exec rake db:migrate:down VERSION=

0

如何回滚迁移

(1)首先确定迁移ID

rake db:migrate:status

  • 复制ID号。

确定要回滚的迁移。

(2)然后回滚迁移

rake db:migrate:down VERSION=20190802023239

  • 粘贴上方的相关ID号。当然,根据您的情况,迁移ID会有所不同!使用正确的迁移ID。

.......现在您可以参加比赛了!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.