使用 rake db:migrate 迁移数据不会改变它
Posted
技术标签:
【中文标题】使用 rake db:migrate 迁移数据不会改变它【英文标题】:Migrating data with rake db:migrate does not change it 【发布时间】:2014-06-20 06:40:44 【问题描述】:我正在为 rails 和 db:migrate 苦苦挣扎。我使用此代码进行了迁移
class SetDefaultInstallmentsForLicenses < ActiveRecord::Migration
def up
License.where(code: 'LEADER').each do |leader|
puts "Modifying license #leader.id with code #leader.code"
leader.installment_available = true
leader.installment_number = 5
leader.save
puts "After save #leader.installment_available #leader.installment_number"
leader = License.find(leader.id)
puts "After save #leader.installment_available #leader.installment_number"
end
end
def down
end
end
运行迁移后有这个输出
== SetDefaultInstallmentsForLicenses: migrating ==============================
Modifying license 3 with code LEADER
After save true 5
After save f
== SetDefaultInstallmentsForLicenses: migrated (0.0037s) =====================
清晰可见执行了迁移,找到了记录,更改并保存了,但重新加载记录后,更改不存在。 怎么了?
【问题讨论】:
你应该做puts leader.save
,才能真正知道保存是否成功。
leader.save 返回 true
【参考方案1】:
您确定它已被保存。我不是。地点:
puts leader.errors.full_messages.to_sentence
leader.save
字符串之后
【讨论】:
【参考方案2】: leader.save
puts "After save #leader.installment_available #leader.installment_number"
==> After save true 5
以上仅显示来自local variable leader
的installment_available
和installment_number
字段的值,而不是从数据库中提取值。 这并不意味着这些字段已成功保存在数据库中。
leader = License.find(leader.id)
puts "After save #leader.installment_available #leader.installment_number"
但上面是从数据库中获取记录,并清楚地表明更新没有保存在数据库中。
使用leader.save!
代替leader.save
。这样,如果记录没有保存,那么您将确切知道为什么由于引发的异常而没有保存它。
更新
根据 OP 对此问题的回答
我试着放了
License.reset_column_information
在代码之前,它似乎是 现在工作。我不知道为什么这里需要这个。我所有的其他 迁移似乎工作正常。
我对@987654329@ 到底做了什么做了一点研究。我发现 Using Models in Your Migrations 说:
使用本地模型时,最好调用 Product.reset_column_information 来刷新 Active Record 缓存 更新数据库中的数据之前的产品模型。
希望这有助于您理解为什么需要License.reset_column_information
。
【讨论】:
大声笑......他们从文档中删除了这个。难怪我花了很长时间才找到 WTF,Rails。 在我的例子中,save!
没有引发异常,即使该列未能更新。此外,您可以使用leader.reload
而不是leader = License.find(leader.id)
来刷新数据库中的记录。【参考方案3】:
我试着放了
License.reset_column_information
在代码之前,它现在似乎正在工作。 我不知道为什么这里需要这个。我的所有其他迁移似乎都运行正常。
【讨论】:
有关详细信息,请参阅我的更新答案。以上是关于使用 rake db:migrate 迁移数据不会改变它的主要内容,如果未能解决你的问题,请参考以下文章
获取:“迁移待定;运行 'bin/rake db:migrate RAILS_ENV=development' 来解决此问题。”克隆和迁移项目后
在 git hook 中使用 rake db:migrate - 未定义的类/模块编码
在 Heroku 上执行 rake db:migrate 时出错
CH2 Hartl 教程迁移正在等待。要解决此问题,请运行: bin/rake db:migrate RAILS_ENV=development