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.
cur.execute('INSERT INTO too VALUES %s', (list_of_rows,))
existiert nicht.
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'))