【问题标题】:Rails migration - change column from varchar to jsonbRails 迁移 - 将列从 varchar 更改为 jsonb
【发布时间】:2023-03-27 15:40:01
【问题描述】:

我正在尝试将 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 类型的输入语法无效 详细信息:令牌“Indigo”无效。 上下文:JSON 数据,第 1 行:Indigo : ALTER TABLE "quotes" ALTER COLUMN "colors" TYPE jsonb USING colors::jsonb

我尝试了其他语法,但仍然出现相同的错误。我想我必须使用 to_json 之类的属性逐个转换整个列属性,但不知道如何解决这个错误。经过多次谷歌搜索,其他出现相同错误的人似乎没有找到解决方案。

【问题讨论】:

    标签: ruby-on-rails json postgresql rails-activerecord


    【解决方案1】:

    您无法通过简单的转换将空格分隔的字符串转换为 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{...} 解释。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-09
      • 2016-10-25
      • 2011-02-17
      • 1970-01-01
      • 2018-12-31
      • 2021-11-30
      • 2016-07-04
      • 1970-01-01
      相关资源
      最近更新 更多