加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 如何重命名列并通过同时迁移更改其类型

发布时间:2020-12-16 20:30:26 所属栏目:百科 来源:网络整理
导读:在我的general_exams表中,我有一个名为semester的列,type为string.现在我想将其名称改为semester_id,type为integer.我已经阅读过关于迁移的内容,它有可用的转换: rename_column(table_name,column_name,new_column_name):重命名列,但保留类型和内容. chang
在我的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操作.所以你可以把那个代码放在那里.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读