2016-05-13 11 views
1

In Mangel an einer beliebigen Quelle, wie eine sqlite Abfrage in Python aus einem Wörterbuch erstellen, ich meine eigene gebaut:Sqlite denkt mir fehlt Bindungen

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) 

, bekomme ich

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

jedoch Diese berauscht mich, wie ich glaube, ich alles, was ich geliefert haben sollte:

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

Sollte nicht diese Backticks doppelte Anführungszeichen sein? – holdenweb

+0

@holdenweb Ich bin nicht so vertraut mit SQLite, aber wie ich mich von anderswo erinnere, wurden Backticks zu Feldern verwendet, und doppelte Anführungszeichen zur Angabe von String-Werten – FooBar

+0

Nun, ich weiß, dass Strings durch einfache Anführungszeichen in allen bekannten Versionen von SQL begrenzt sind . Bei allen, die ich kenne, erfordern Feldnamen doppelte Anführungszeichen. Vielleicht ist das der Fehler. In der Abfrage benötigen Sie keine Anführungszeichen für die Spaltennamen, da sie alle gültigen SQL-Bezeichner sind. – holdenweb

Antwort

1

Sie brauchen nicht die : in die values Schlüssel. Versuchen Sie folgendes:

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

Oder mehr erschöpfende:

values = information 

Beispielprogramm:

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() 

Ergebnis:

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