2016-12-18 126 views
1

我有非常大的字典,我想插入到MySQL表中。字典鍵是表中的列名。我構建我這樣的查詢,截至目前:帶有字符串的查詢格式

bigd = {'k1':'v1', 'k2':10} 
cols = str(bigd.keys()).strip('[]') 
vals = str(bigd.values()).strip('[]') 
query = "INSERT INTO table ({}) values ({})".format(cols,vals) 
print query 

輸出:

"INSERT INTO table ('k2', 'k1') values (10, 'v1')" 

而且這部作品在Python2.7

但是在Python 3.6,如果我用字符串文字像這樣:

query = f"INSERT INTO table ({cols}) values ({vals})" 
print(query) 

它打印此:

"INSERT INTO table (dict_keys(['k1', 'k2'])) values (dict_values(['v1', 10]))" 

任何提示?

+2

你不應該用字符串格式**來形成查詢字符串**,它會讓你接受注入攻擊。閱讀您正在使用的數據庫引擎的文檔,該文檔告訴您如何通過在查詢中放置佔位符並讓它們執行格式化來實現。 – jonrsharpe

+0

@jonrsharpe感謝您的提示。將切換到佔位符。但有沒有辦法擺脫這些「dict_keys」的一些其他類似的應用程序,這將維護引號周圍的字符串和整數沒有引號。 – MYGz

+1

問題在於你是在以一種天真的方式開始處理列表字面值的字符串。 '','。join(map(repr,whatever))'更整潔,並繼續工作。 – jonrsharpe

回答

1

對於你的好奇心,你應該意識到,你已經投這些以str,得到的dict_keys/values表示要插入f-string

你可以只轉換爲元組,然後插入:

cols = tuple(bigd.keys()) 
vals = tuple(bigd.values()) 
q = f"INSERT INTO table {cols} values {vals}" 

但是,正如評論指出,這不是一種安全的方法。

+0

謝謝。這工作。 – MYGz