2017-09-21 7 views
0

j'ai script suivant python pour insérer des données dans psqlunnest avec l'erreur de jeter psycopg2

from psycopg2 import connect 


con = connect( """my string""") 

query = """ INSERT INTO test.result_data 
       SELECT id, 
        result, 
        result1, 
        result2 
       FROM unnest(%s) s(id text, result real, result real, result integer) 
""" 
t = [('1234jc', 0.0, 1.2123, 1), ('1234sc', 1.0, 1.74, 1)] 
c = con.cursor() 
c.execute(query, (t,)) 

il jette l'erreur suivante

psycopg2.ProgrammingError: function return row and query-specified return row do not match 
DETAIL: Returned type unknown at ordinal position 1, but query expects text. 

Suite est la table strucutre dans la base

|---------------|-------| 
|column name | type | 
|---------------|-------| 
|id    | text | 
|---------------|-------| 
|result   |float8 | 
|---------------|-------| 
| cpr   |float8 | 
|---------------|-------| 
|cpr30   |float8 | 
|---------------|-------| 
+0

Pensez à utiliser des guillemets simples pour les valeurs de chaîne dans 't'. En outre, vous répétez la colonne 'result' dans votre liste de définition de colonne –

+0

mises à jour, toujours le même numéro –

Répondre

1

Vous devez convertir ces tableaux en type parce que postgres ne sait pas comment faire correspondre le type composite dans votre enregistre dans la liste de définition de colonne.

CREATE TYPE f AS (col1 text, col2 real, col3 real, col4 int); 

SELECT * FROM 
UNNEST(
    ARRAY[('1234jc', 0.0, 1.2123, 1), ('1234sc', 1.0, 1.74, 1)] :: f[] 
); 

En Python

query = """ CREATE TYPE f AS (id text, result real, result1 real, result2 int); 
      INSERT INTO test.result_data 

      SELECT id, 
        result, 
        result1, 
        result2 
      FROM unnest(%s :: f[]) 
      AS s(id text, result real, result1 real, result2 integer) 
""" 
+0

Merci, ça marche :) –