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 psycopg2module Python, qui ne prend pas en charge l'utilisation de plusieurs lignes dans les VALUESarguments. 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'))