2016-04-26 9 views
1

Ok Ich versuche, eine vorhandene SQLite3 Datenbank mit Instanzvariablen (typ und lvl) zu aktualisieren, um im GrundeVerwenden von Instanzvariablen in SQLite3 update?

#Set variables 
typ = 'Test' 
lvl = 6 

#Print Databse 
print("\nHere's a listing of all the records in the table:\n") 
for row in cursor.execute("SELECT rowid, * FROM fieldmap ORDER BY rowid"): 
    print(row) 

#Update Info 
sql = """ 
UPDATE fieldmap 
SET buildtype = typ, buildlevel = lvl 
WHERE rowid = 11 
""" 

cursor.execute(sql) 

#Print Databse 
print("\nHere's a listing of all the records in the table:\n") 
for row in cursor.execute("SELECT rowid, * FROM fieldmap ORDER BY rowid"): 
    print(row) 

als Fehler Ich erhalte

sqlite3.OperationalError: no such column: typ 

Jetzt weiß ich im Grunde das Problem ist, dass meine Variable mit der falschen Syntax eingefügt wird, aber ich kann nicht für das Leben von mir das richtige finden. Es arbeitet mit Streichern und Ints ganz gut so:

sql = """ 
UPDATE fieldmap 
SET buildtype = 'house', buildlevel = 3 
WHERE rowid = 11 
""" 

Aber sobald ich auf die Variablen schalten sie den Fehler auslöst.

Antwort

2

Ihre Abfrage fügt die Werte der Variablen typ und lvl nicht tatsächlich in die Abfragezeichenfolge ein. Wie geschrieben, versucht die Abfrage, die Spalten typ und lvl zu referenzieren, aber diese existieren nicht in der Tabelle.

Versuchen Schreiben ist als parametrisierte Abfrage:

sql = """ 
UPDATE fieldmap 
SET buildtype = ?, buildlevel = ? 
WHERE rowid = 11 
""" 

cursor.execute(sql, (typ, lvl)) 

Die ? fungiert als Platzhalter in dem Query-String, die durch die Werte in dem Tupel execute() weitergegeben ersetzt wird. Dies ist eine sichere Methode zum Erstellen der Abfrage und vermeidet SQL-Injection-Schwachstellen.

-1

Hey ich denke, Sie sollten ORM verwenden, um mit SQL-Datenbank zu manipulieren.

SQLAlchemy ist dein Freund. Ich benutze das mit SQLite, MySQL, PostgreSQL. Es ist fantastisch.

Das kann Sie von diesem Syntaxfehler wegkommen, da SQL Kommas und Anführungszeichen als wichtig nimmt.

Für harte Codierung, können Sie dies versuchen:

sql = """ 
UPDATE fieldmap 
SET buildtype = '%s', buildlevel = 3 
WHERE rowid = 11 
""" % (house) 

Dieses Ihr Problem vorübergehend lösen kann, aber nicht für lange Sicht. ORM ist dein Freund.

Hoffe, das könnte hilfreich sein!

+0

In Ordnung klingt vielversprechend, ich werde einen Blick darauf werfen! – Syntic

+0

** NIEMALS ** verwenden Sie '% s' oder' str.format' in SQL-Befehlen, die an Ihre Datenbank übergeben werden. Es ist anfällig für SQL-Injektion. – aim100k

+0

@ aim100k Ja, wir wissen es. Deshalb verwenden wir ORM anstelle von Hardcoding. Doch diejenigen, die sich hauptsächlich für die Injektion interessieren, würden ihr eigenes SQL-ORM außer SQLAlchemy verwenden. – dotslash