2012-02-17 95 views
25

我正在嘗試使用dict來執行SQL INSERT。邏輯基本上是:對SQL INSERT語句使用Python詞典

INSERT INTO table (dict.keys()) VALUES dict.values() 

但是,我有一個艱難的時間搞清楚正確的語法/流程來做到這一點。這是我目前有:

# data = {...} 
sorted_column_headers_list = [] 
sorted_column_values_list = [] 
for k, v in data.items(): 
    sorted_column_headers_list.append(k) 
    sorted_column_values_list.append(v) 
sorted_column_headers_string = ', '.join(sorted_column_headers_list) 
sorted_column_values_string = ', '.join(sorted_column_values_list) 

cursor.execute("""INSERT INTO title (%s) 
      VALUES (%s)""", 
      (sorted_column_headers_string, sorted_column_values_string)) 

由此我得到一個SQL異常(我認爲相關的事實,逗號也包括在一些我的數值)。什麼纔是正確的方法來做到上述?

回答

15

您想要將參數佔位符添加到查詢中。這可能會得到你需要的東西:

qmarks = ', '.join('?' * len(myDict)) 
qry = "Insert Into Table (%s) Values (%s)" % (qmarks, qmarks) 
cursor.execute(qry, myDict.keys() + myDict.values()) 
+7

對於MySQL:'格式= ''。加入([ '%s' 的] * LEN(數據))' – David542 2012-02-21 22:04:26

+0

fyi:這對我不起作用,但是@furicle的回答確實是 – Tjorriemorrie 2014-06-09 14:08:51

35

我覺得在MySQL中使用這個評論並不完整。 MySQLdb的不做參數替代在列,只值(IIUC) - 所以也許更像

placeholders = ', '.join(['%s'] * len(myDict)) 
columns = ', '.join(myDict.keys()) 
sql = "INSERT INTO %s (%s) VALUES (%s)" % (table, columns, placeholders) 
cursor.execute(sql, myDict.values()) 

你沒有得到逃避列上的,所以你可能想先檢查他們.. ..

http://mail.python.org/pipermail/tutor/2010-December/080701.html一個更完整的解決方案

+4

'cursor.execute(qry,columns,myDict.values())'這行有一個語法錯誤。 'cursor.execute(qry,myDict.values())'是正確的形式。 – Mehraban 2014-02-25 12:39:48

+3

是否有關於字典的任何排序問題? – zx1986 2015-12-01 02:22:50

+1

有史以來最好的答案! – Aliweb 2016-07-19 22:51:13

1
table='mytable'  
columns_string= '('+','.join(myDict.keys())+')'  
values_string = '('+','.join(map(str,myDict.values()))+')'  
sql = """INSERT INTO %s %s 
    VALUES %s"""%(table, columns_string,values_string) 
+0

不錯的答案。購買你需要在聯合中引用單引號,以便更實用。 '(''+'\',''。join(myDict.keys())+'')'or better'('「+'','」。join(myDict.keys())+ 「')」 – peter 2015-03-16 18:36:07

-2

什麼:

keys = str(dict.keys()) 
keys.replace('[', '(') 
keys.replace(']', ')') 
keys.replace("'",'') 

vals = str(dict.values()) 
vals.replace('[', '(') 
vals.replace(']', ')') 

cur.execute('INSERT INTO table %s VALUES %s' % (keys, vals)) 

對於Python 3:

keys = str(dict.keys())[9:].replace('[', '').replace(']', '') 
vals = str(dict.values())[11:].replace('[', '').replace(']', '') 

...

5

總是好的答案在這裏,但在Python 3,你應該寫如下:

placeholder = ", ".join(["%s"] * len(dict)) 
stmt = "insert into `{table}` ({columns}) values ({values});".format(table=table_name, columns=",".join(dict.keys()), values=placeholder) 
cur.execute(stmt, list(dict.values())) 

不要忘了dict.values()轉換爲一個列表,因爲在Python 3中,dict.values()返回一個視圖,而不是一個列表。

另外,不要倒在stmtdict.values()因爲眼淚報價一個字符串由荷蘭國際集團join它,這在插入它造成MySQL錯誤。所以你應該總是動態地把它放在cur.execute()

2

我試過@ furicle的解決方案,但它仍然輸入一切作爲一個字符串 - 如果你的字典是一個混合的那麼這可能無法正常工作,因爲你會希望它。我有一個類似的問題,這就是我想出的 - 這只是一個查詢生成器,你可以使用它(與變化)來處理您選擇的任何數據庫。看一看!

def ins_query_maker(tablename, rowdict): 
keys = tuple(rowdict) 
dictsize = len(rowdict) 
sql = '' 
for i in range(dictsize) : 
    if(type(rowdict[keys[i]]).__name__ == 'str'): 
     sql += '\'' + str(rowdict[keys[i]]) + '\'' 
    else: 
     sql += str(rowdict[keys[i]]) 
    if(i< dictsize-1): 
     sql += ', ' 
query = "insert into " + str(tablename) + " " + str(keys) + " values (" + sql + ")" 
print(query) # for demo purposes we do this 
return(query) #in real code we do this 

這是粗糙的,仍然需要健康檢查等,但它的工作原理如預期。 爲一個字典:

tab = {'idnumber': 1, 'fname': 'some', 'lname': 'dude', 'dob': '15/08/1947', 'mobile': 5550000914, 'age' : 70.4} 

運行查詢我得到以下輸出

results of query generated by the suite