2016-05-10 8 views
0

Import habe ich ein Tupel wie untenWert Fehler beim Daten in Postgres-Tabelle mit psycopg2

data = ({'weather station name': 'Substation', 'wind': '6 km/h', 'barometer': '1010.3hPa', 'humidity': '42%', 'temperature': '34.5 C', 'place_id': '001D0A00B36E', 'date': '2016-05-10 09:48:58'}) 

Ich versuche, die Werte aus der obigen Tupel der Postgres-Tabelle mit dem Code unten zu drücken:

try:                                                   
    con = psycopg2.connect("dbname='WeatherForecast' user='postgres' host='localhost' password='****'")                           
    cur = con.cursor()                                                 
    cur.executemany("""INSERT INTO weather_data(temperature,humidity,wind,barometer,updated_on,place_id) VALUES (%(temperature)f, %(humidity)f, %(wind)f, %(barometer)f, %(date)s, %(place_id)d)""", final_weather_data) 
    ver = cur.fetchone()                                                 
    print(ver)                                                   

except psycopg2.DatabaseError as e:                                              
    print('Error {}'.format(e))                                               
    sys.exit(1) 

finally:                                                     

    if con:                                                    
    con.close() 

Wo Datentyp jedes Feld in der DB als unten: id Serien NOT NULL,

temperature double precision NOT NULL, 
humidity double precision NOT NULL, 
wind double precision NOT NULL, 
barometer double precision NOT NULL, 
updated_on timestamp with time zone NOT NULL, 
place_id integer NOT NULL, 

Wenn ich den Code ausführen, um die Daten mit psycopg2 in Postgres-Tabelle zu pushen, verursacht es einen Fehler "ValueError: unsupported format character 'f'"

Ich hoffe, das Problem besteht in der Formatierung. Bin mit Python3.4

Antwort

0

Haben Sie einen Blick auf die documentation:

The variables placeholder must always be a %s , even if a different placeholder (such as a %d for integers or %f for floats) may look more appropriate:

>>> cur.execute("INSERT INTO numbers VALUES (%d)", (42,)) # WRONG 
>>> cur.execute("INSERT INTO numbers VALUES (%s)", (42,)) # correct 

Während der SQL-Abfrage enthält alle Arten von Platzhalter:

"""INSERT INTO weather_data(temperature,humidity,wind,barometer,updated_on,place_id) 
    VALUES (%(temperature)f, %(humidity)f, %(wind)f, %(barometer)f, %(date)s, %(place_id)d)""" 
+0

Ich habe versucht, alle Platzhalter Wechsel zu% s. Aber ich erhalte TypeError: Tuple-Indizes müssen ganze Zahlen sein, nicht str. – Harnish

+0

Alle Daten, die Sie im 'dict' haben, haben ein String-Format, z. "Wind": "6 km/h", während Sie erwarten, dass die Winddoppelpräzision NICHT NULL ist, was ein doppelter Wert ist. Sie müssen zuerst einen Konverter schreiben, der die Daten, die Sie haben, explizit zu dem formatiert, was in die Datenbank eingegeben werden soll, und dann zu Postgres für das Einfügebit kommen. – AKS

+0

Nun, ich habe den Feld-Datentyp geändert, um Zeichen zu variieren. Jetzt habe ich versucht, alle Platzhalter auf% s zu ändern. Immer noch der Fehler "TypeError: Tupel-Indizes müssen ganze Zahlen sein, nicht str." bleibt gleich. – Harnish

Verwandte Themen