2017-12-11 16 views
1

varchar型の既存の列をjsonbに変換しようとしています。この列には "black white orange"のような文字列が含まれており、それを "black"、 "white"、 "orange"に変換されるようにjsonb形式に変換します。Railsの移行 - varcharからjsonbへの列の変更

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

私はjsonbする列の型を変換するために、これに期待して使用した:一部は、同様にjsonbするために、既存のデータを変換します。型JSON 詳細は無効な入力構文:

のActiveRecord :: StatementInvalid:PG :: InvalidTextRepresentation:ERROR

は代わりに、私はこのエラーを取得するトークン "インディゴ" を無効です。 CONTEXT:JSONデータ、ライン1:インディゴ :ALTER TABLEのは、色を使用してCOLUMN "色" TYPEのjsonbをALTER "引用" :: jsonb

私は他の構文を試してみましたが、それでも同じエラーで終了しました。私はto_jsonのようなもので属性ごとに列の属性全体を変換しなければならないと思っていますが、このエラーを解決する方法はわかりません。多くのGoogle検索の後、同じエラーを持つ他の人が解決策を見つけるように見えなかった。

答えて

1

単純なキャストを使用してスペース区切り文字列からJSONに変換することはできません。

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

してからJSONにその配列を変換します:簡単な方法は、まずPostgreSQLの配列(text[])を取得するまでの文字列を破るためにある

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

あなたが引用して注意する必要がありますし、バックスラッシュは、RubyによるSQLのビットを取得し、データベースにあなたが言うだろう:

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

%q{...}は、単一引用符で囲まれた文字列のようなものですが、あなたはサイコーを避けることができますgを使ってSQL文字列リテラルの一重引用符をエスケープしてから、逆転を二重にして、%q{...}によって解釈されないようにします。

関連する問題