gpt4 book ai didi

ruby-on-rails - Rails 迁移 - 将列从 varchar 更改为 jsonb

转载 作者:行者123 更新时间:2023-11-29 13:16:57 25 4
gpt4 key购买 nike

我正在尝试将现有的 varchar 类型的列转换为 jsonb。该列包含诸如“black white orange”之类的字符串,并希望将其转换为 jsonb 格式,以便将其转换为 ["black", "white", "orange"]。

class AlterColorsDatatype < ActiveRecord::Migration[5.0]
def change
change_column :quotes, :colors, :jsonb, default: '[]', using: 'colors::jsonb'
end
end

我希望将列类型转换为 jsonb 并且 using: 部分也会将现有数据转换为 jsonb。

相反,我收到此错误:

ActiveRecord::StatementInvalid:PG::InvalidTextRepresentation:错误:json 类型的输入语法无效详细信息: token “Indigo”无效。上下文:JSON 数据,第 1 行:Indigo: ALTER TABLE "quotes"ALTER COLUMN "colors"TYPE jsonb USING colors::jsonb

我尝试了其他语法,但仍然以同样的错误告终。我在想我必须使用 to_json 之类的属性逐个转换整个列属性,但我不确定如何解决此错误。 google了很多次,其他出现同样错误的人似乎都没有找到解决办法。

最佳答案

您无法通过简单的强制转换从以空格分隔的字符串转换为 JSON。一种简单的方法是首先将字符串分解以获得 PostgreSQL 数组 (text[]):

regexp_split_to_array(colors, E'\\s+')

然后将该数组转换为 JSON:

to_json(regexp_split_to_array(colors, E'\\s+'))

您必须小心使用引号和反斜杠才能通过 Ruby 获取那部分 SQL 并将其输入数据库,因此您会说:

using: %q{to_json(regexp_split_to_array(colors, E'\\\\s+'))}

%q{...} 就像一个单引号字符串,但可以让您避免在 SQL 字符串文字中转义单引号,然后加倍反斜杠以防止它们被由 %q{...} 解释。

关于ruby-on-rails - Rails 迁移 - 将列从 varchar 更改为 jsonb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47759676/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com