首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何通过迁移同时重命名一列并更改其类型

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

Stack Overflow用户
提问于 2012-11-20 17:58:43
回答 4查看 17.9K关注 0票数 25

在我的general_exams表中,有一个名为semester的列,类型为string。现在,我想将其名称更改为semester_id,类型为integer。我读过关于迁移的文章,它有可用的转换:

  • rename_column(table_name,类型,选项):重命名列,但保留类型和选项( column_name,column_name,new_column_name):使用与add_column相同的参数将列更改为不同的类型。

因此,我像这样创建迁移文件:

代码语言:javascript
复制
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时,它出现错误:

代码语言:javascript
复制
==  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中,我销毁了所有数据。那么,任何人都可以告诉我如何做到这一点?或者我必须创建两个迁移文件?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-11-20 18:02:18

您的问题可能是semester包含无法转换为integers的数据。这就是为什么会出现强制转换错误的原因。

我怀疑您需要做更多的工作才能使其工作,因为唯一想到的就是删除列并使用正确的值创建一个新的列。

但您可以在一次迁移中简单地使用remove_column,然后使用add_column。这应该是完美无瑕的。

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

请记住,您可以在迁移中进行ActiveRecord操作。所以你可以把代码放进去。

票数 12
EN

Stack Overflow用户

发布于 2015-05-26 16:57:27

这在Rails 4中是有效的

代码语言:javascript
复制
def change
  rename_column :general_exams, :semester, :semester_id
  change_column :general_exams, :semester_id, :integer
end
票数 19
EN

Stack Overflow用户

发布于 2012-11-20 18:06:16

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13470670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档