2016-08-29 5 views
0

In Python 3+ möchte ich Werte aus einem Wörterbuch (oder Pandas Dataframe) in eine Datenbank einfügen. Ich habe mich für psycopg2 mit einer Postgres-Datenbank entschieden.Psycopg2 Python-Wörterbuch in Postgres-Datenbank einfügen

Die Probleme sind, dass ich den richtigen Weg nicht herausfinden kann, dies zu tun. Ich kann leicht eine SQL-Zeichenfolge verketten, die ausgeführt wird, aber die psycopg2-Dokumentation warnt ausdrücklich davor. Im Idealfall wollte ich so etwas wie dies tun:

cur.execute("INSERT INTO table VALUES (%s);", dict_data) 

und zu hoffen, dass die herausführen könnte, dass die Schlüssel der dict die Spalten in der Tabelle übereinstimmt. Das hat nicht funktioniert. Aus den Beispielen der psycopg2 Dokumentation habe ich diesen Ansatz

cur.execute("INSERT INTO table (" + ", ".join(dict_data.keys()) + ") VALUES (" + ", ".join(["%s" for pair in dict_data]) + ");", dict_data) 

von dem ich ein

TypeError: 'dict' object does not support indexing 

bekommen Was ist die PhytoNic Art und Weise ein Wörterbuch in eine Tabelle einzufügen mit Spaltennamen passend?

Antwort

3

Zwei Lösungen:

d = {'k1': 'v1', 'k2': 'v2'} 

insert = 'insert into table (%s) values %s' 
l = [(c, v) for c, v in d.items()] 
columns = ','.join([t[0] for t in l]) 
values = tuple([t[1] for t in l]) 
cursor = conn.cursor() 
print cursor.mogrify(insert, ([AsIs(columns)] + [values])) 

keys = d.keys() 
columns = ','.join(keys) 
values = ','.join(['%({})s'.format(k) for k in keys]) 
insert = 'insert into table ({0}) values ({1})'.format(columns, values) 
print cursor.mogrify(insert, d) 

Ausgang:

insert into table (k2,k1) values ('v2', 'v1') 
insert into table (k2,k1) values ('v2','v1') 
+0

Vor/Nachteile dieses im Vergleich zu dem vorgeschlagenen SQL? Die zweite Lösung ist im Grunde die gleiche wie die vorgeschlagene Lösung (außer String Format vs Compoundierung)? Afaik cur.execute calls cur.mogrify bei Bedarf? – Paamand

0

[Empfohlene Antwort/Abhilfe - bessere Antworten geschätzt werden!]

Nach einigem Versuch/Fehler habe ich folgendes zu arbeiten:

sql = "INSERT INTO table (" + ", ".join(dict_data.keys()) + ") VALUES (" + ", ".join(["%("+k+")s" for k in dict_data]) + ");" 

Diese

"INSERT INTO table (k1, k2, ... , kn) VALUES (%(k1)s, %(k2)s, ... , %(kn)s);" 
die SQL-Zeichenfolge gibt

, die von

with psycopg2.connect(database='deepenergy') as con: 
    with con.cursor() as cur: 
     cur.execute(sql, dict_data) 
ausgeführt werden kann

Post/Nachteile?