我有一个迁移文件db\migrate\20100905201547_create_blocks.rb。
如何具体回滚该迁移文件?
我有一个迁移文件db\migrate\20100905201547_create_blocks.rb。
如何具体回滚该迁移文件?
当前回答
此外:
当您很久以前部署的迁移不允许您迁移新的迁移时。
我在一个较大的Ruby on Rails应用程序中工作,其中有超过1000个迁移文件。而且,我们需要一个月的时间来发布一个中等规模的功能。我正在开发一个功能,一个月前我已经部署了一个迁移,然后在审查过程中,迁移的结构和文件名发生了变化,现在我尝试部署我的新代码,构建失败了,说:
ActiveRecord::StatementInvalid: PG::DuplicateColumn: ERROR: column "my_new_field" of relation "accounts"已经存在
上述解决方案都不适合我,因为旧的迁移文件丢失了,而我打算在新迁移文件中创建的字段已经存在于数据库中。对我来说唯一有效的解决方法是:
我把文件转移到服务器上了 我打开了rails控制台 我在IRB会话中需要该文件 然后AddNewMyNewFieldToAccounts.new.down
然后我可以再次运行部署构建。
其他回答
迁移使用该命令更改数据库的状态
bundle exec rake db:migrate
我们可以使用
bundle exec rake db:rollback
要从头再来,我们可以用
bundle exec rake db:migrate VERSION=0
正如您可能猜到的那样,将任何其他数字替换为0将迁移到该版本号,其中版本号来自按顺序列出的迁移。
回滚上次迁移:
# 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
如果你想要回滚和迁移,你可以运行:
rake db:migrate:redo
也就是:
rake db:rollback
rake db:migrate
rake db:rollback STEP=1
是一种方法,如果要回滚的迁移是最后应用的迁移。您可以将1替换为您想要返回的任意多次迁移。
例如:
rake db:rollback STEP=5
还将回滚之后发生的所有迁移(4,3,2和1)。
要将所有迁移回滚到(并包括)目标迁移,请使用:(此更正命令是在原始帖子中指出错误的所有注释之后添加的)
rake db:migrate VERSION=20100905201547
为了只回滚一个特定的迁移(乱序)使用:
rake db:migrate:down VERSION=20100905201547
注意,这不会回滚任何调解迁移——只回滚列出的迁移。如果这不是您想要的,您可以安全地运行rake db:migrate,它将只重新运行该文件,跳过之前未回滚的其他文件。
如果你想要迁移一个无序的迁移,还有它的逆db:migrate:up:
rake db:migrate:up VERSION=20100905201547
迁移文件是这样的,
20221213051020_my_migrations
在本例中,模型名应该是MyMigration。migration以一个复数词结尾,所以它以migrations结尾。
要回滚这个特定的迁移,您必须理解迁移名称的第一部分(迁移名称前面的数字)是迁移编号。
要回滚这次迁移,只需打开终端并写入,
rake db:migrate:down VERSION=migration_number
最后,你必须在终端中输入回滚这个特定的迁移,
在终端上写下面的命令回滚一个特定的迁移,上面的命令只是给你解释
rake db:migrate:down VERSION=20221213051020
只需记住,每次迁移都有不同的迁移编号,因此请仔细观察并手动复制、粘贴或键入。