La siguiente consulta funciona:
SELECT a, b
FROM unnest(ARRAY[(1,2), (3,4)])
AS t(a integer, b integer);
a b
_ _
1 2
3 2
Sin embargo, no pude usar un tipo de columna 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, en el segundo caso, el tipo de columna se infiere como unknown
, que no se convierte varchar(255)
automáticamente.
¿Cómo hago para que el segundo ejemplo funcione y devuelva columnas con el tipo correcto, si es posible sin advertencias y sin modificar la ARRAY[...]
definición?
Antecedentes: estoy tratando de mejorar el rendimiento de las operaciones de inserción masiva grandes utilizando el psycopg2
módulo Python, que no admite el uso de varias filas en los VALUES
argumentos. Me topé con el ejemplo anterior mientras probaba algunos otros métodos.
cur.execute('INSERT INTO too VALUES %s', (list_of_rows,))
no existe.
VALUES
. Lo siguiente funciona bien para mí:cur.execute('INSERT INTO foo VALUES (%s, %s), (%s, %s), (%s, %s)', (1, 'foo', 2, 'bar', 3, 'baz'))