La seguente query funziona:
SELECT a, b
FROM unnest(ARRAY[(1,2), (3,4)])
AS t(a integer, b integer);
a b
_ _
1 2
3 2
Tuttavia, non sono stato in grado di utilizzare un diverso tipo di colonna come 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.
Sembra che, nel secondo caso, venga inferito il tipo di colonna unknown
, che non viene varchar(255)
automaticamente castato .
Come faccio a far funzionare il secondo esempio e restituire colonne con il tipo giusto, se possibile senza avvisi e senza modificare la ARRAY[...]
definizione?
Contesto: sto cercando di migliorare le prestazioni di operazioni di inserimento di grandi quantità utilizzando il psycopg2
modulo Python, che non supporta l'utilizzo di più righe negli VALUES
argomenti. Mi sono imbattuto nell'esempio sopra mentre provavo altri metodi.
cur.execute('INSERT INTO too VALUES %s', (list_of_rows,))
non esiste.
VALUES
. Per me funziona perfettamente:cur.execute('INSERT INTO foo VALUES (%s, %s), (%s, %s), (%s, %s)', (1, 'foo', 2, 'bar', 3, 'baz'))