PostgreSQL不能将类型json转换为字符变化[]

时间:2017-09-30 13:20:15

标签: ruby-on-rails postgresql ruby-on-rails-5 postgresql-9.3 rails-migrations

在我的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[]

如何进行此迁移?

1 个答案:

答案 0 :(得分:0)

我猜数组元素是文件名。如果是这样,那么你可以删除所有字符[]"和空格并将结果拆分为数组,如下所示:

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[]