你如何跳过失败的迁移?(rake db:migrate)

hmi*_*ind 40 rake ruby-on-rails rails-migrations

我似乎无法找到允许我跳过迁移的选项或任何内容.

我知道你在想什么:"你永远不应该那样做......"

我需要跳过一个迁移,它对我的​​开发数据库中不存在的特定用户记录进行更改.我不想更改迁移,因为它不是我应该使用的源代码的一部分.有没有办法跳过迁移或跳过失败的迁移?

提前致谢!

mu *_*ort 61

我认为你应该把违规的迁移修复得不那么脆弱,我猜这几个if陈述也许rescue就足够了.

但是,如果修复迁移确实不是一种选择,您可以通过各种方式伪造它.首先,您可以注释掉迁移方法,运行rake db:migrate,然后取消注释(或还原)违规迁移.

你也可以在数据库中伪造它,但是除非你知道你在做什么并且你不介意在你(不可避免地)犯错时手动修补,否则不建议使用这种类型的诡计.您的数据库中有一个表,schema_migrations其中有一个varchar(255)名为version; 此表用于db:migrate跟踪已应用的迁移.您需要做的就是插入适当的version值,rake db:migrate并认为迁移已经完成.找到有问题的迁移文件:

db/migrate/99999999999999_XXXX.rb
Run Code Online (Sandbox Code Playgroud)

然后进入你的数据库说:

insert into schema_migrations (version) values ('99999999999999');
Run Code Online (Sandbox Code Playgroud)

其中99999999999999,当然,从迁移的文件名称中的数字.然后运行rake db:migrate应该跳过该迁移.

我会在第三个选项之前使用第二个选项,我只包括schema_versions完整性的"hack "选项.

  • 幸运的是,我也没办法处理.哈哈 (2认同)

小智 16

我有一个问题,我有一个迁移,添加一个已经存在的表,所以在我的情况下,我不得不跳过这个迁移,因为我收到错误

SQLite3::SQLException: table "posts" already exists: CREATE TABLE "posts"
Run Code Online (Sandbox Code Playgroud)

我只是注释掉了create table方法的内容,运行了迁移,然后取消注释掉了.这是一种解决它的手动方式,但它有效.见下文:

class CreatePosts < ActiveRecord::Migration
  def change
    # create_table :posts do |t|
    #   t.string :title
    #   t.text :message
    #   t.string :attachment
    #   t.integer :user_id
    #   t.boolean :comment
    #   t.integer :phase_id

    #   t.timestamps
    # end
  end
end
Run Code Online (Sandbox Code Playgroud)


Joh*_*ohn 15

这是一次性错误的好方法.

db:migrate:up VERSION=my_version

这将运行一个特定迁移的"向上"操作.(如果需要,也可以反过来,只需将"up"替换为"down".)这样,您可以运行将来迁移,使旧版本(您需要跳过)工作,或者只运行每个有选择地进行迁移.

我也相信你可以这样重做迁移:

rake db:migrate:redo VERSION=my_version

我个人没试过那种方法,所以YMMV.


Dor*_*ian 7

如果你必须这样做,你的应用程序的迁移就搞砸了!

插入所有缺少的迁移:

def insert(xxx)
  ActiveRecord::Base.connection.execute("insert into schema_migrations (version) values (#{xxx})") rescue nil
end

files = Dir.glob("db/migrate/*")
files.collect { |f| f.split("/").last.split("_").first }.map { |n| insert(n) }
Run Code Online (Sandbox Code Playgroud)

  • 不必要.例如,如果您将生产数据库pg_restore到开发计算机以解决生产数据问题.当你没有所有的信息时,不要这么快就告诉某人他们做错了. (2认同)