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 "选项.
小智 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.
插入所有缺少的迁移:
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)
| 归档时间: |
|
| 查看次数: |
29514 次 |
| 最近记录: |