将data_type数组字符串的column_id转换为整数的迁移是什么?
示例:
一行的template_id值为[" 2"]。我希望它是2.
template_id的所有值在数组中都有一个元素。
答案 0 :(得分:2)
我会建议采用以下方法来做到这一点
temp_template_id
int
template_id
的所有值插入temp_template_id
template_id
temp_template_id
重命名为template_id
一个。 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)