La requête suivante fonctionne:
SELECT a, b
FROM unnest(ARRAY[(1,2), (3,4)])
AS t(a integer, b integer);
a b
_ _
1 2
3 2
Cependant, je n'ai pas pu utiliser un type de colonne différent tel que 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.
Il semble que, dans le deuxième cas, le type de colonne est déduit comme unknown
, qui n'est pas converti varchar(255)
automatiquement.
Comment faire fonctionner le deuxième exemple et renvoyer des colonnes avec le bon type, si possible sans avertissements et sans modifier la ARRAY[...]
définition?
Contexte: J'essaie d'améliorer les performances des opérations d'insertion en bloc volumineuses à l'aide du psycopg2
module Python, qui ne prend pas en charge l'utilisation de plusieurs lignes dans les VALUES
arguments. Je suis tombé sur l'exemple ci-dessus en essayant d'autres méthodes.
cur.execute('INSERT INTO too VALUES %s', (list_of_rows,))
n'existe pas.
VALUES
. Les choses suivantes fonctionnent très bien pour moi:cur.execute('INSERT INTO foo VALUES (%s, %s), (%s, %s), (%s, %s)', (1, 'foo', 2, 'bar', 3, 'baz'))