2016-08-29 47 views
0

在python 3+中,我想從字典(或pandas數據框)中插入數據到數據庫中。我選擇了使用postgres數據庫的psycopg2。Psycopg2在postgres數據庫中插入python字典

問題是我找不到正確的方法來做到這一點。我可以輕鬆地連接要執行的SQL字符串,但psycopg2文檔明確警告了這一點。理想的情況是我想要做這樣的事情:

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

,並希望執行可以計算出該字典的鍵列匹配表。這沒有奏效。從psycopg2文檔的例子我得到了這種方法

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

從中我得到一個

TypeError: 'dict' object does not support indexing 

什麼是插入一個字典與列名匹配的表的最phytonic方法是什麼?

回答

3

兩個解決方案:

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) 

輸出:這

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

優點/缺點與所提供的SQL?第二種解決方案基本上與提議的解決方案相同(字符串格式與複合除外)?如果需要,Afaik cur.execute調用cur.mogrify? – Paamand

0

[建議答案/解決方法 - 更好的答案是讚賞!]

一些試驗後/錯誤我得到了以下工作:

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

這使SQL字符串

"INSERT INTO table (k1, k2, ... , kn) VALUES (%(k1)s, %(k2)s, ... , %(kn)s);" 

其中可執行

with psycopg2.connect(database='deepenergy') as con: 
    with con.cursor() as cur: 
     cur.execute(sql, dict_data) 

Post/cons?