在我的Rails 5.0.5应用程序中,我需要将json string, array: true**.**列转换为
我的json列中的值如下:
[ "200px-RR5219-0015R.png", "2017_03_25_2235.doc", "137555.jpg" ]我尝试过这种迁移:
class ChangeTaskAttachmentsTypeToString < ActiveRecord::Migration[5.0]
def change
change_column :tasks, :attachments, :string, array: true
end
end并得到了以下错误:
ActiveRecord::StatementInvalid: PG::DatatypeMismatch: ERROR: column "attachments" cannot be cast automatically to type character varying[]
HINT: You might need to specify "USING attachments::character varying[]".
: ALTER TABLE "tasks" ALTER COLUMN "attachments" TYPE character varying[]然后我编辑了迁移:
class ChangeTaskAttachmentsTypeToString < ActiveRecord::Migration[5.0]
def change
change_column :tasks, :attachments, 'character varying[] USING attachments::character varying[]'
end
end最后得到了这个错误:
PG::CannotCoerce: ERROR: cannot cast type json to character varying[]
: ALTER TABLE "tasks" ALTER COLUMN "attachments" TYPE character varying[] USING attachments::character varying[]我怎样才能进行这种迁移呢?
发布于 2017-09-30 14:55:00
我猜数组元素是文件名。如果是这样,则可以删除所有字符[]"和空格,并将结果拆分为数组,如下所示:
with my_table(attachments) as (
values
('[ "200px-RR5219-0015R.png", "2017_03_25_2235.doc", "137555.jpg" ]'::json)
)
select string_to_array(translate(attachments::text, '[] "', ''), ',')::varchar[]
from my_table;
string_to_array
---------------------------------------------------------
{200px-RR5219-0015R.png,2017_03_25_2235.doc,137555.jpg}
(1 row)因此,请使用:
... USING string_to_array(translate(attachments::text, '[] "', ''), ',')::varchar[]一个更正式(更一般)的解决方案将需要一个自定义功能,例如:
create or replace function json_to_text_array(json)
returns text[] language sql immutable as $$
select array_agg(value)
from json_array_elements_text($1)
$$;可以用在
alter table tasks alter column attachments type text[]
using json_to_text_array(attachments);注意,我使用了text[]作为Postgres的一个更自然的选择,但是如果它重要的话,您可以用varchar[]代替它。
在Db<>fiddle.中测试
https://stackoverflow.com/questions/46503111
复制相似问题