在我的general_exams
表中,有一个名为semester
的列,类型为string
。现在,我想将其名称更改为semester_id
,类型为integer
。我读过关于迁移的文章,它有可用的转换:
因此,我像这样创建迁移文件:
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, :semester_id)
-> 0.0572s
-- change_column(:general_exams, :semester_id, :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中,我销毁了所有数据。那么,任何人都可以告诉我如何做到这一点?或者我必须创建两个迁移文件?
发布于 2012-11-20 18:02:18
您的问题可能是semester
包含无法转换为integers
的数据。这就是为什么会出现强制转换错误的原因。
我怀疑您需要做更多的工作才能使其工作,因为唯一想到的就是删除列并使用正确的值创建一个新的列。
但您可以在一次迁移中简单地使用remove_column,然后使用add_column。这应该是完美无瑕的。
我还建议您首先只使用add_column,然后执行映射过程,将旧的semester
值映射到新的semester_id
,然后删除该列。
请记住,您可以在迁移中进行ActiveRecord操作。所以你可以把代码放进去。
发布于 2015-05-26 16:57:27
这在Rails 4中是有效的
def change
rename_column :general_exams, :semester, :semester_id
change_column :general_exams, :semester_id, :integer
end
发布于 2012-11-20 18:06:16
此错误是因为表中存在现有数据(或默认值,可能..)该PG不知道如何将字符串转换为整数。使用PG特定的SQL (我想你会想要USING
)和execute
迁移命令,摆脱数据或者告诉PG你想如何转换它。请参阅Rails迁移指南。
https://stackoverflow.com/questions/13470670
复制相似问题