it-swarm.com.de

Fügen Sie ein JSON-Array in die Postgres-Tabelle ein

TEIL 1 :

Ich verwende Postgres 9.5 und versuche herauszufinden, wie mit einem Array von JSON in eine Postgres-Tabelle eingefügt wird. Ich habe eine Tabelle mit den folgenden Befehlen erstellt:

CREATE TABLE inputtable (
data_point_id SERIAL PRIMARY KEY NOT NULL,
chart_id INTEGER NOT NULL,
user_id INTEGER NOT NULL,
properties jsonb NOT NULL
);

Das json-Datenformat sieht folgendermaßen aus:

[
    { col1: a, col2: 5, col3: 1, col4: one},
    { col1: b, col2: 6, col3: 2, col4: two},
    { col1: c, col2: 7, col3: 3, col4: three}
]

Aufgrund einiger Änderungen muss ich jetzt in der Lage sein, ein json-Objekt pro Zeile basierend auf user_id einzufügen. Am Ende möchte ich, dass die Ausgabe folgendermaßen aussieht:

data_point_id  | chart_id | user_id |  properties
---------------+----------+----------+--------------
    1          |    1     |     1    | { "col1": "a", "col2": 1, "col3": 1, "col4": "one"}
    2          |    1     |     1    | { "col1": "b", "col2": 2, "col3": 2, "col4": "two"}
    3          |    1     |     1    | { "col1": "c", "col2": 3, "col3": 3, "col4": "three"}

Ich habe versucht, die Daten mit unnest in die Tabelle einzufügen, wobei:

INSERT INTO inputtable (user_id, chart_id, properties) 
    SELECT (1, 1, unnest('{ "col1": "a", "col2": 1, "col3": 1, "col4": "one"},{ "col1": "b", "col2": 2, "col3": 2, "col4": "two"},{ "col1": "c", "col2": 3, "col3": 3, "col4": "three"}')::json)

aber ich bekomme eine Fehlermeldung über Typ ERROR: could not determine polymorphic type because input has type "unknown".

TEIL 2 :

Ich würde auch gerne wissen, wie eine solche Tabelle aktualisiert werden kann. Ich nehme beispielsweise Änderungen am Datenpunkt im JSON-Format vor und möchte die Eigenschaften ändern. Ich erwarte eine Ausgabe von:

data_point_id  | chart_id | user_id  |  properties
---------------+----------+----------+--------------
    1          |    1     |     1    | { "col1": "a", "col2": 6, "col3": 7, "col4": "eight"}
    2          |    1     |     1    | { "col1": "b", "col2": 10, "col3": 11, "col4": "twelve"}
    3          |    1     |     1    | { "col1": "c", "col2": 3, "col3": 3, "col4": "new"} 

Verwenden von Daten wie folgt:

[
    { col1: a, col2: 6, col3: 7, col4: eight},
    { col1: b, col2: 10, col3: 11, col4: twelve},
    { col1: c, col2: 3, col3: 3, col4: new}
]

Wie kann dies erreicht werden? Ich denke, die Frage zu Teil 2 kann durch jsonb_populate_recordset gelöst werden, bin mir aber nicht sicher. Die Verwendung von Postgres für JSON ist für mich neu, sieht aber sehr leistungsfähig aus und ich schätze die Unterstützung, die mir dabei hilft, dies herauszufinden!

4
unseen_damage

TEIL 1 - EINFÜGEN

Sie müssen nicht unnest(), sondern jsonb_array_elements() verwenden und der JSON-Datenstruktur eckige Klammern hinzufügen. Ich empfehle Ihnen, eine JSON-Validator-Website wie JSONlint zu verwenden, um die Richtigkeit Ihrer JSON-Daten zu testen.

Dieser Code fügt 3 neue Datensätze in inputtable ein:

WITH json_array AS (
    SELECT 1 AS user_id, 
           2 AS chart_id,
           jsonb_array_elements('
               [
                 {
                    "col1": "a",
                    "col2": 1,
                    "col3": 1,
                    "col4": "one"
                 }, {
                    "col1": "b",
                    "col2": 2,
                    "col3": 2,
                    "col4": "two"
                 }, {
                    "col1": "c",
                    "col2": 3,
                    "col3": 3,
                    "col4": "three"
                }
               ]'::jsonb) AS properties
)
INSERT INTO inputtable (user_id, chart_id, properties) 
SELECT * FROM json_array

TEIL 2 - AKTUALISIERUNG

Um zu aktualisieren, müssen Sie data_point_id Werte, also müssen Sie sie a priori kennen.

Dies funktioniert perfekt, aber wahrscheinlich gibt es andere naive Lösungen:

WITH update_table AS(
   SELECT unnest(ARRAY[1, 2, 3]) AS data_point_id,
          jsonb_array_elements('
            [
              {
                "col1": "a",
                "col2": 6,
                "col3": 7,
                "col4": "eight"
              }, {
                "col1": "b",
                "col2": 10,
                "col3": 11,
                "col4": "twelve"
              }, {
                "col1": "c",
                "col2": 3,
                "col3": 3,
                "col4": "new"
              }
           ]'::jsonb) AS properties 
    FROM inputtable
)
UPDATE inputtable 
SET properties = update_table.properties
FROM update_table
WHERE inputtable.data_point_id = update_table.data_point_id
5
pietrop