【发布时间】:2019-12-06 03:35:46
【问题描述】:
我运行了以下迁移并忘记包含我想要的默认值。我正在尝试回滚它,以便我可以添加默认值并再次前滚。
20190728151635_add_cooldown_to_skill_levels.rb
class AddCooldownToSkillLevels < ActiveRecord::Migration[5.1]
def change
add_column :skill_levels, :cooldown, :integer
end
end
所有 rails db:migrate 和 db:rollbacks 都失败并出现以下错误
$ rails db:rollback
== 20190728151635 AddCooldownToSkillLevels: reverting =========================
-- remove_column(:skill_levels, :cooldown, :integer)
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:
SQLite3::ConstraintException: FOREIGN KEY constraint failed: DROP TABLE "skill_levels"
And 100+ more lines ...
我尝试将迁移更改为使用明确的向上/向下方法无济于事
class AddCooldownToSkillLevels < ActiveRecord::Migration[5.1]
def up
add_column :skill_levels, :cooldown, :integer
end
def down
remove_column :skill_levels, :cooldown
end
end
我尝试添加一个只添加默认值的新迁移。
20190728153208_add_default_value_to_cooldown_on_skill_levels.rb
class AddDefaultValueToCooldownOnSkillLevels < ActiveRecord::Migration[5.1]
def change
change_column_default :skill_levels, :cooldown, 1
end
end
类似的错误 $ rails db:迁移
== 20190728153208 AddDefaultValueToCooldownOnSkillLevels: migrating ===========
-- change_column_default(:skill_levels, :cooldown, 1)
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:
SQLite3::ConstraintException: FOREIGN KEY constraint failed: DROP TABLE "skill_levels"
And 100+ more lines ...
我很乐意直接在 SQL 中修复它,但我正在努力保持我的迁移完好无损。
编辑:添加 $ rails db:migrate:status 的输出
...
up 20190727160901 Create skill levels
up 20190728004535 Create skill effects
up 20190728151635 Add cooldown to skill levels
down 20190728153208 Add default value to cooldown on skill levels
感谢您的帮助。
【问题讨论】:
-
帮自己一个忙,使用真正的数据库进行开发,postgres 是我的选择,但 mysql 也不错。
-
这个问题似乎与 sqlite 如何处理 ALTER TABLE 命令有关。我没有证明这一点,但我相信可以在这里找到解决方案:sqlite.org 在“进行其他类型的表架构更改”部分。这个过程看起来很痛苦。
-
已经在安装 pg.在这个烂摊子上每天损失 1/2。感谢上帝的单元测试。
-
对你有好处,我希望 Rails 团队停止使用 sqlite 作为默认数据库,在 SO 上有一个又一个问题关于这个问题。
标签: ruby-on-rails sqlite ruby-on-rails-5 rails-migrations