迁移将字符串数组转换为整数

时间:2018-01-08 10:55:27

标签: ruby-on-rails postgresql migration

将data_type数组字符串的column_id转换为整数的迁移是什么?

示例:

一行的template_id值为[" 2"]。我希望它是2.

template_id的所有值在数组中都有一个元素。

2 个答案:

答案 0 :(得分:2)

我会建议采用以下方法来做到这一点

  1. 使用数据类型temp_template_id
  2. 创建新字段int
  3. template_id的所有值插入temp_template_id
  4. 删除列template_id
  5. 将列temp_template_id重命名为template_id
  6. 一个。 rails g migration AddTempTemplateDataToTableName

    def change
      add_column :table_name, :temp_template_id, :integer
    end
    

    湾rails g migration RenameColumnTemptemplateID

    def self.up
      # Script to fill column `temp_template_id` from 'template_id'
      remove_column :table_name, :template_id
      rename_column :table_name, :temp_template_id, :template_id
    end
    
    def self.down      
      rename_column :table_name, :template_id, :temp_template_id
      add_column :table_name, :template_id, :array, :default => []
      # Script to fill column `template_id` from 'temp_template_id'
    end
    

答案 1 :(得分:1)

SQL迁移就像using n[1]一样简单:

t=# create table t3(n int[]);
CREATE TABLE
t=# insert into t3 select array[2];
INSERT 0 1
t=# select * from t3;
  n
-----
 {2}
(1 row)

t=# alter table t3 alter COLUMN n type int using n[1];
ALTER TABLE
t=# select * from t3;
 n
---
 2
(1 row)

如果您的数组不是int[],则需要双重强制转换以避免

  

错误:无法转换“template_id”列的USING子句的结果   自动输入整数提示:您可能需要添加显式   铸造。

alter table t3 alter COLUMN n type int using n[1]::text::int;

应该做的就是这个例子:

t=# create table t3(n text[]);
CREATE TABLE
t=# insert into t3 select array[2];
INSERT 0 1
t=# select * from t3;
  n
-----
 {2}
(1 row)

t=# alter table t3 alter COLUMN n type int using n[1]::text::int;
ALTER TABLE
t=# select * from t3;
 n
---
 2
(1 row)