2012-01-11 251 views
3

我有一個字典,我想將所有的值添加到sqlite數據庫。字典中的所有鍵存在於數據庫中,並且所有鍵都是字符串類型。然而,我無法將值存入數據庫。下面的代碼是醜陋的,不安全的和錯誤每當遇到一個字符串了「,但它那種工作。插入python字典到SQLite數據庫

Query="INSERT INTO packages VALUES(" 
    for tag in Tags: 
     Query=Query + '"' + Package[tag] + '", ' 
    Query=Query[:-2]+")" 
cursor.execute(Query) 

我怎樣才能優雅地解決這一問題,以便它是安全的,並接受輸入, 「在字符串?我遇到了其他一些方法。例如:

fields = Package.keys() 
values = Package.values() 
query = "INSERT INTO packages (%s) VALUES (%%s);" % (",".join(fields)) 
cursor.execute(query, values) 

但它會拋出一個類型錯誤。

TypeError: function takes at most 2 arguments (38 given) 

最優雅的解決方案,我所遇到到目前爲止似乎是

sql_insert = ('INSERT INTO packages (%s) VALUES (%s)' % 
      (','.join('%s' % name for name in Package), 
      ','.join('%%(%s)s' % name for name in Package))) 
cursor.execute(sql_insert, Package) 

但它拋出一個運行錯誤,再一次說

sqlite3.OperationalError: near "%": syntax error 

,我的問題是如何能我優雅地安全地將字典中的值添加到數據庫中?

P.S.值得注意的是,我正在使用Python 2.5.1。

回答

3

Afaik,查詢時有一個「?」佔位符execute()方法根據參數類型自動轉義。因此,下面應該工作:

query = 'INSERT INTO packages VALUES(%s)' % ','.join(['?'] * len(Tags)) 
cursor.execute(query, Tags) 
+0

廠像一個魅力。謝謝! – Trcx 2012-01-11 05:17:48

+0

除了如果'標籤'是OP使用的字典,'標籤'只會傳遞密鑰名稱,並且它們將以任意順序排列。 – 2012-01-11 05:18:16

+0

不幸的是,這並沒有實際的工作,因爲它創建了字段名稱作爲數據值的數據庫條目。我認爲它正在工作,因爲這個腳本運行時沒有發生錯誤,如果我今天早上看數據庫(讓它在一夜之間運行),它沒有合適的值。 – Trcx 2012-01-11 14:35:55

1

我也碰到過同樣的問題,但是我有,並不是所有的字典條目包含的表的所有列的問題,所以我創建了以下解決方案

keys, values = zip(*Package.items()) 
insert_str = "INSERT INTO packages (%s) values (%s)" % (",".join(keys),",".join(['?']*len(keys))) 
cursor.execute(insert_str,values) 
相關問題