我需要将数据库中列的数据类型从:string
更改为:decimal
。所有值都采用以下格式:"129.99"
,因此转换它们不应引发任何错误。
为此,我写了以下迁移:
def change
change_column :my_table, :target_column, :decimal
end
当我执行此操作时,它会向我显示以下错误以及如何修复它的提示:
PG::DatatypeMismatch: ERROR: column "target_column" cannot be cast automatically to type numeric
HINT: You might need to specify "USING target_column::numeric".
但是,我似乎无法找到有关如何执行此操作的任何文档,因此提示并不能帮助我。
执行此迁移的最佳方式是什么?
答案 0 :(得分:9)
这应该做:
def change
change_column :my_table, :target_column, 'numeric USING CAST(target_column AS numeric)'
end
答案 1 :(得分:3)
对于只希望更改列类型并且不关心该字段中的数据会发生什么情况的人。
只需删除该列,然后使用正确的类型重新创建它:
def change
remove_column :table_name, :field
add_column :table_name, :field, :type
end
答案 2 :(得分:0)
我尝试将列的类型从date转换为boolean with
change_column :my_table, :target_column, 'boolean USING CAST(target_column AS boolean)'
仍然收到错误PG::CannotCoerce: ERROR: cannot cast type date to boolean
我猜这个错误的发生是因为我们试图将列类型转换为完全不同的类型。如果新类型与旧类型(如日期和布尔值)如此不同,当然提供了之下尚未存储的数据,一个' lazier'并且更健全(对我而言)替代方法是简单地删除旧类型的列并创建具有相同名称和新类型的新列