A seguinte consulta funciona:
SELECT a, b
FROM unnest(ARRAY[(1,2), (3,4)])
AS t(a integer, b integer);
a b
_ _
1 2
3 2
No entanto, não pude usar um tipo de coluna diferente, como 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.
Parece que, no segundo caso, o tipo de coluna é inferido como unknown
, que não é convertido varchar(255)
automaticamente.
Como faço para o segundo exemplo funcionar e retornar colunas com o tipo certo, se possível sem avisos e sem modificar a ARRAY[...]
definição?
Antecedentes: Estou tentando melhorar o desempenho de operações de inserção em massa grandes usando o psycopg2
módulo Python, que não suporta o uso de várias linhas nos VALUES
argumentos. Eu tropecei no exemplo acima enquanto tentava outros métodos.
cur.execute('INSERT INTO too VALUES %s', (list_of_rows,))
isso não existe.
VALUES
. O seguinte funciona muito bem para mim:cur.execute('INSERT INTO foo VALUES (%s, %s), (%s, %s), (%s, %s)', (1, 'foo', 2, 'bar', 3, 'baz'))