2017-09-21 1 views
0

i-Skript haben folgende Python-Daten in psqlUNNEST mit psycopg2 Fehler werfen

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,)) 

es wirft einfügen Fehler folgende

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. 

Es folgt Tabelle strucutre in Datenbank

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

Betrachten Sie in 't' einfache Anführungszeichen für String-Werten. Außerdem wiederholen Sie die Spalte "result" in Ihrer Spalte Definitionsliste –

+0

aktualisierte Zitate, immer noch die gleiche Ausgabe –

Antwort

1

Sie müssen diese Arrays in einen Typ umwandeln, da Postgre nicht wissen, wie Sie den zusammengesetzten Typ in Ihrem Typ abgleichen können zeichnet in die Spaltendefinitionsliste auf.

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[] 
); 

In 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

Danke, es funktioniert :) –