2016-06-30 11 views
0

Ich benutze das MySQLdb-Modul in Python zum Schreiben von SQL-Anweisungen. Es fällt mir schwer, Variablen so zu verwenden, wie ich es möchte. Hier ist meine Arbeit:Verwenden von execute()/executemany() für SQL-Anweisungen in Python

stmt = "\ 
INSERT INTO Table1\ 
(name, status)\ 
SELECT (:name1, :status1)\ 
     FROM dual\ 
WHERE NOT EXISTS (\ 
     SELECT 1 FROM Table1\ 
     WHERE name =(:name1))" 
dic = {"name1":"Bob", "status1":"Active"} 

dbcursor.executemany(stmt, dic) 
dbconnection.commit() 
print("Insertion to Table1 committed\n\n") 

Das funktioniert nicht, ich Rollback schließlich mit der Fehlermeldung not all arguments converted during string formatting. Wenn ich die Wörterbuchwerte fest codiere, funktioniert die Einfügung gut. Können Sie mich auf die richtige Art der Verwendung von Variablen anstelle von fest codierten Werten hinweisen?

+1

Tipp: Verwenden Sie '" "" ... "" "' Triple Zitate und Sie müssen nicht alle diese Backslashes verwenden .. –

+0

Sicher gibt es eine Ausnahme, wenn alles zurückgerollt wird? –

+0

@MartijnPieters ja, es ist "nicht alle Argumente während der Formatierung von Strings konvertiert" –

Antwort

0

executemany() nimmt eine Sequenz von Parameterobjekten (Wörterbücher), aber Sie sind in nur ein vorbei. Verwenden Sie entweder dbcursor.execute() oder übergeben Sie eine Reihe von Wörterbüchern. Da Sie nur ein Wörterbuch haben, benutzen Sie einfach dbcursor.execute():

dbcursor.execute(stmt, dic) 

Da executemany() behandelt das zweite Argument als eine Reihe von Parametern, von denen jede in einem separaten execute() Anruf verwendet wird, versuchen Sie effektiv die Anweisungen ausgeführt werden mit Die Tasten des Wörterbuchs als Parameter. Tatsächlich produziert in Ihrem dic als Parameter übergeben:

for key in dic: 
    dbcursor.execute(stmt, key) 

, wo der Schlüssel auch ein iterable ist, die Herstellung von getrennten Zeichen als die Parameter verwendet. Sie versuchen, die Anweisung mit ('n', 'a', 'm', 'e', '1') und ('s', 't', 'a', 't', 'u', 's', '1') auszuführen. Das funktioniert nicht für deine Aussagen.

+0

Habe das gerade versucht. Der Fehler sagt mir, dass ich meine Syntax überprüfen soll, also ist das ein Fortschritt und ich überprüfe meine SQL-Version jetzt auf Syntaxregeln –

Verwandte Themen