Die folgende Abfrage funktioniert:
SELECT a, b
FROM unnest(ARRAY[(1,2), (3,4)])
AS t(a integer, b integer);
a b
_ _
1 2
3 2
Ich konnte jedoch keinen anderen Spaltentyp verwenden, z. B varchar(255)
.:
SELECT a, b
FROM unnest(ARRAY[(1,'hello'), (3,'world')])
AS t(a integer, b varchar(255));
ERROR: 42804: function return row and query-specified return row do not match
DETAIL: Returned type unkown at ordinal position 2, but query expects text.
Es scheint, dass im zweiten Fall der Spaltentyp als abgeleitet wird unknown
, der nicht varchar(255)
automatisch umgewandelt wird.
Wie kann ich das zweite Beispiel zum Laufen bringen und Spalten mit dem richtigen Typ zurückgeben, wenn möglich ohne Warnungen und ohne Änderung der ARRAY[...]
Definition?
Hintergrund: Ich versuche, die Leistung großer Masseneinfügungsvorgänge mithilfe des psycopg2
Python-Moduls zu verbessern , das die Verwendung mehrerer Zeilen in VALUES
Argumenten nicht unterstützt . Ich bin auf das obige Beispiel gestoßen, als ich einige andere Methoden ausprobiert habe.
VALUES
. Folgendes funktioniert gut für mich:cur.execute('INSERT INTO foo VALUES (%s, %s), (%s, %s), (%s, %s)', (1, 'foo', 2, 'bar', 3, 'baz'))
cur.execute('INSERT INTO too VALUES %s', (list_of_rows,))
existiert nicht.Antworten:
Sie können dies tun, ohne eine Warnung zu generieren, indem Sie einen Typ erstellen und die Datensätze in diesen umwandeln:
getestet auf 9.4 und 9.3 (db <> fiddle here )
quelle
Es ist hässlich, aber Sie können versuchen:
Auf diese Weise
AS
stimmt der in definierte Typ mit der Ausgabe von übereinunnest()
, die Sie in derSELECT
Liste an Ihre Anforderungen anpassen können.Sie können dies in einer kleinen SQLFiddle versuchen .
quelle
Sollte es tun:
quelle
psycopg2
, Typumwandlungen in dieARRAY[...]
Definition aufzunehmen. Ist es möglich, darauf zu verzichten? Ich habe meine Frage bearbeitet, um dies widerzuspiegeln.