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.
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'))
cur.execute('INSERT INTO too VALUES %s', (list_of_rows,))
no existe.Respuestas:
Puede hacerlo sin generar una advertencia creando un tipo y transmitiéndole los registros:
probado en 9.4 y 9.3 (db <> violín aquí )
fuente
Es feo, pero puedes probar:
De esta forma, el tipo definido en
AS
coincide con la salida deunnest()
, que puede convertir a sus necesidades en laSELECT
lista.Puede probar esto en un pequeño SQLFiddle .
fuente
Deberías hacerlo:
fuente
psycopg2
inclusión de los tipos dentro de laARRAY[...]
definición. ¿Es posible hacerlo sin? Edité mi pregunta para reflejar eso.