2017-12-11 4 views
1

Ich versuche, eine vorhandene Spalte des Typs Varchar zu Jsonb zu konvertieren. Die Spalte enthält Zeichenfolgen wie "schwarz weiß orange" und möchte sie in das jsonb-Format konvertieren, sodass sie in ["schwarz", "weiß", "orange"] konvertiert wird.Schienenmigration - Spalte von Varchar zu Jsonb ändern

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

ich dies erwartet den Spaltentyp zu konvertieren jsonb und die Verwendung von: bestehenden Datenteil umwandeln würde auch jsonb.

Stattdessen bekomme ich diesen Fehler:

Active :: StatementInvalid: PG :: InvalidTextRepresentation: Fehler: ungültige Eingabesyntax für Typ json DETAIL: Token "Indigo" ist ungültig. CONTEXT: JSON-Daten, Zeile 1: Indigo : ALTER TABLE "zitiert" Spalte "Farben" TYPE ALTER jsonb Farben :: jsonb

Ich habe andere Syntax versucht, aber immer noch endet mit dem gleichen Fehler auf. Ich denke, dass ich das ganze Spaltenattribut durch Attribut mit etwas wie to_json umwandeln müsste, aber bin nicht sicher, wie man diesen Fehler löst. Nach vielen Google-Suchen scheinen andere Personen mit dem gleichen Fehler keine Lösung gefunden zu haben.

Antwort

1

Sie können mit einer einfachen Umwandlung nicht von einer durch Leerzeichen getrennten Zeichenfolge zu einem JSON wechseln. Eine einfache Möglichkeit ist es, zunächst die Zeichenfolge zu brechen ein PostgreSQL-Array zu erhalten (text[]):

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

und wandelt dann das Array zu JSON:

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

Sie müssen mit dem Zitat, vorsichtig sein und Schrägstriche, dass etwas von SQL durch Ruby bekommen und in die Datenbank so würde man sagen:

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

die %q{...} ist wie eine einzige Zeichenfolge in Anführungszeichen, aber können Sie havin vermeiden g Um die einfachen Anführungszeichen im SQL-String-Literal zu umgehen, verdoppeln Sie die Backslashes, damit sie nicht von %q{...} interpretiert werden.

Verwandte Themen