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.
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'))
cur.execute('INSERT INTO too VALUES %s', (list_of_rows,))
n'existe pas.Réponses:
Vous pouvez le faire sans générer d'avertissement en créant un type et en y castant les enregistrements:
testé en 9.4 et 9.3 (db <> violon ici )
la source
C'est moche, mais vous pouvez essayer:
De cette façon, le type défini dans
AS
correspond à la sortie deunnest()
, que vous pouvez caster selon vos besoins dans laSELECT
liste.Vous pouvez essayer ceci dans un petit SQLFiddle .
la source
Devrait le faire:
la source
psycopg2
inclusion de transtypages de type dans laARRAY[...]
définition. Est-il possible de s'en passer? J'ai modifié ma question pour refléter cela.