ruby-on-rails Rails迁移将字符串转换为整数?

e0bqpujr  于 2022-12-30  发布在  Ruby
关注(0)|答案(4)|浏览(156)

是否可以将字符串字段更改为整数而不清除已输入的数据?
所讨论的表的当前数据库结构为:

create_table :people do |t|
t.string :company_id

使用迁移是否可以做到这一点?
我在想,也许在迁移中删除旧字段,创建一个新的整数字段-但我担心这会清除所有已经输入的数据。
谢谢你,
丹尼

nwo49xxi

nwo49xxi1#

不要丢弃列,使用此列

change_column :table_name, :column_name, 'integer USING CAST(column_name AS integer)'

从PostgreSQL得到的“提示”基本上告诉您,您需要确认您希望发生这种情况,以及应该如何转换数据。要确认更改,请在迁移中使用上面的块

gblwokeq

gblwokeq2#

其他的答案都是正确的,但是您可以使用:using关键字更进一步:

change_column :people, :company_id, :integer, using: 'company_id::integer'
iqxoj9l9

iqxoj9l93#

不要删除该列,这将清除数据。
不过你可以试试

change_column :people, :company_id, :integer

并且如果company_id中的所有值都可以转换为integer,则应该是好的。
如果不是这种情况(即不是所有字符串都可以默认转换),那么你可以做两个步骤:1)创建一个新列,然后在转换后加载company_id。2)删除company_id,然后重命名新列。
您应该小心使用这两种方法(第二种方法更是如此),如果可以的话,您可能应该首先在数据库的副本上执行此操作。

hujrc8aj

hujrc8aj4#

我需要处理一些空字符串值,所以在转换为整数之前,我先将它们转换为nil

class ChangeOrderLeadTimeFromStringToInteger < ActiveRecord::Migration[6.0]

  def up
    Product.where(order_lead_time: '').update_all(order_lead_time: nil)
    change_column :products, :order_lead_time, 'integer USING CAST(order_lead_time AS integer)' 
    change_column_null :products, :order_lead_time, true
  end

  def down
    change_column :products, :order_lead_time, :string
    change_column_null :products, :order_lead_time, true 
  end

end

相关问题