2016-05-13 66 views
1

在缺乏如何從字典中創建了一個Python sqlite查詢任何來源的,我建我自己:sqlite的認爲我沒有綁定

updates = ', '.join(["`"+field+"`" + '=:'+field for field in information.keys() if field != 'name']) 
    where = ' WHERE name == :name' 
    values = {':'+field: value for field, value in information.items()} 

    query = 'UPDATE firms SET ' + updates + where 
    c.execute(query, values) 

不過,我得到

sqlite3.ProgrammingError: You did not supply a value for binding 1. 

這befuddles我,我想我已經提供了所有我應該有:

In[374]: query 
Out[374]: 'UPDATE firms SET `founded`=:founded, `size`=:size, `headquarters`=:headquarters, `type`=:type, `revenue`=:revenue WHERE name == :name' 
In[375]: information 
Out[375]: 
{'founded': '1962', 
'headquarters': 'Bentonville, AR', 
'name': 'Walmart', 
'revenue': '$10+ billion (USD) per year', 
'size': '10000+ employees', 
'type': 'Company - Public (WMT)'} 
+0

如果不是那些反引號是雙引號? – holdenweb

+0

@holdenweb我不熟悉sqlite,但正如我從別處回憶,反引號用於字段,並用雙引號表示字符串值 – FooBar

+0

嗯,我知道字符串是由所有已知版本的SQL中的單引號分隔。在所有我熟悉的領域中,字段名稱(引用時)都需要雙引號。也許這是錯誤。在查詢中,您不需要引用列名稱,因爲它們都是有效的SQL標識符 – holdenweb

回答

1

你並不需要在:鍵爲values。試試這個:

values = {field: value for field, value in information.items()} 

或者,更succintly:

values = information 

樣例程序:

import sqlite3 

conn = sqlite3.connect(":memory:") 
c = conn.cursor() 

c.execute("create table firms (founded, hq, name, rev, size, type)") 
c.execute("insert into firms (name) values (?) ",("bar",)) 
conn.commit() 

def update(information): 
    updates = ', '.join(["`"+field+"`" + '=:'+field for field in information.keys() if field != 'name']) 
    where = ' WHERE name == :name' 
    values = information 
    query = 'UPDATE firms SET ' + updates + where 
    c.execute(query, values) 
    conn.commit() 

update(dict(name='bar', founded='1062', rev='1 MILLION DOLLARS!')) 
print c.execute('select * from firms').fetchall() 

結果:

[(u'1062', None, u'bar', u'1 MILLION DOLLARS!', None, None)]