如何重命名列并通过迁移同时更改其类型

在我的general_exams表中,我有一个名为semester的列,type是string 。 现在我想将其名称更改为semester_id ,类型为integer 。 我已阅读有关迁移的信息,它有可用的转换:

  • rename_column(table_name,column_name,new_column_name):重命名列但保留类型和内容。
  • change_column(table_name,column_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, :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中,我销毁了所有数据。 所以,任何人都可以告诉我该怎么做? 或者我必须创建两个迁移文件?

您的问题可能是该semester包含无法转换为integers 。 这就是你得到施法错误的原因。

我怀疑你需要做更多的工作来完成这项工作,因为唯一想到的就是删除列并创建一个具有正确值的新列。

但是你可以在一次迁移中简单地删除_column然后再添加add_column。 这应该完美无瑕。

我还建议您先添加add_column,然后执行映射过程,将旧的semester值映射到新的semester_id ,然后删除该列。

请记住,您可以在迁移中执行ActiveRecord操作。 所以你可以把那些代码放在那里。

这适用于Rails 4

 def change rename_column :general_exams, :semester, :semester_id change_column :general_exams, :semester_id, :integer end 

此错误是因为表中存在数据(或默认值,可能是..)PG不知道如何从字符串转换为整数。 要么摆脱数据,要么告诉PG你要如何转换它,使用PG特定的SQL(我想你会想要USING )并execute迁移命令。 请参阅有关迁移的Rails指南。

我希望这有帮助

 class ModifyColumnTables 
  改变
     remove_column:posts,:old_column
     add_column:posts,:new_column,:type_of_column
  结束
结束