我正在尝试将数据库迁移到我的heorku实例中,我收到错误。 FAQ描述了我的错误如下:
无法更改列类型
示例:PGError:ERROR:列 “verified_at”无法转换为类型 “日期”
原因:PostgreSQL不知道如何操作 将该表中的所有行强制转换为 指定的类型。最有可能的意思是 你有一个整数或一个字符串 那一栏。
解决方案:检查您的记录和 确保他们可以转换为 新型。有时它更容易 只是避免使用change_column, 重命名/创建新列 代替。
如何立即更改此迁移。这是我的问题。对于我的联系人表,我创建了以下内容:
t.string :date_entered
在稍后的迁移中,我执行以下操作:
change_column :contacts, :date_entered, :date
此change_column似乎是问题所在。
我应该......手动改变迁移吗?有没有办法可以清理表格中的数据(我不知道Heroku会识别表格中的数据,因为我正在做耙子)。
我显然需要更改此值,并在整个应用程序中使用它。感谢。
这就是我想要的......想法?
def self.up
#change_column :contacts, :date_entered, :date
#this fails in postgres, so trying the same outcome
rename_column :contacts, :date_entered, :date_entered_old
add_column :contacts, :date_entered, :date
remove_column :contacts, :date_entered_old
end
def self.down
add_column :contacts, :date_entered_old
remove_column :contacts, :date_entered
rename_column :contacts, :date_entered_old, :date_entered
end
答案 0 :(得分:40)
执行以下操作:
换句话说
def self.up
rename_column :contacts, :date_entered, :date_entered_string
add_column :contacts, :date_entered, :date
Contact.reset_column_information
Contact.find_each { |c| c.update_attribute(:date_entered, c.date_entered_string) }
remove_column :contacts, :date_entered_string
end
答案 1 :(得分:1)
这是Simone Carletti解决方案的经过修改和测试的版本
class ModifyContacts < ActiveRecord::Migration
def self.up
rename_column :contacts, :date_entered, :date_entered_string
add_column :contacts, :date_entered, :date
Contact.reset_column_information
Contact.find(:all).each { |contact| contact.update_attribute(:date_entered, contact.date_entered_string) }
remove_column :contacts, :date_entered_string
end
end