在我的general_exams表中,我有一个名为semester的列,type为string.现在我想将其名称改为semester_id,type为integer.我已经阅读过关于迁移的内容,它有可用的转换:
> rename_column(table_name,column_name,new_column_name):重命名列,但保留类型和内容.
> change_column(table_name,type,options):使用与add_column相同的参数将列更改为其他类型.
所以,我创建我的迁移文件,如下所示:
class RenameSemesterFromGeneralExams < ActiveRecord::Migration def change rename_column :general_exams,:semester,:semester_id change_column :general_exams,:semester_id,:integer end end
但是,当我运行rake db:migrate时,它有错误:
== RenameSemesterFromGeneralExams: migrating ================================= -- rename_column(:general_exams,:semester_id) -> 0.0572s -- change_column(:general_exams,:integer) rake aborted! An error has occurred,this and all later migrations canceled: PG::Error: ERROR: column "semester_id" cannot be cast to type integer : ALTER TABLE "general_exams" ALTER COLUMN "semester_id" TYPE integer
在我的表GeneralExam中,我销毁了所有数据.
所以,任何人都可以告诉我如何做到这一点或者我必须创建两个迁移文件?
解决方法
您的问题可能是该学期包含无法转换为整数的数据.这就是为什么你得到一个投射错误.
我怀疑你需要做更多的工作来使这项工作成为唯一需要注意的是删除列并创建一个具有正确值的新列.
但是,您可以在一次迁移中简单地remove_column,然后add_column.这应该是无瑕疵的.
我还建议您先添加add_column,然后执行映射过程,将旧的学期值映射到新的semester_id上,然后删除列.
请记住,您可以在迁移过程中执行ActiveRecord操作.所以你可以把那个代码放在那里.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。