Die Python DB-API 2.0 sieht vor, dass man mit der execute-Methode eines Cursors-Objekts den SQL-String und die einzufügenden Werte trennt. Dadurch können die Werte von dem verwendeten Datenbankmodul automatisch richtig gequotet werden. cursor.execute hat zwei Parameter, der erste ist der SQL-String, der zweite, optionale, sind die Parameter. Ganz egal, von welchem Typ die Spalten bzw. Variablen sind, sie werden vom Datenbank-Modul richtig gequotet.
cursor.execute(operation[,parameters])
Natürlich gibt es da, wie sollte es anders sein, einige Stolpersteine. Zum Beispiel gibt es hier gleich fünf Arten des Quotens. Welche benutzt wird, kann man über dbapi.paramstyle herausfinden.
Auch wenn es auf den ersten Blick aufwändig erscheint, das SQL-Quoting zu nutzen, ist es sehr wichtig, um gegen SQL-Injections gewappnet zu sein! Dabei darf man die Funktion der DB-API nicht mit den normalen String Formatting Operations verwechseln.
Grundlegende Infos gibt es in der Maillingliste.
Folgende Variationen gibt es:
format
format sieht das %s-Zeichen als Platzhalter vor, man kann nur Positionsargumente übergeben.
1 cursor.execute('''
2 INSERT INTO my_table (feld1, feld2)
3 VALUES (%s, %s)
4 ''', ('aaaaaa', None))
pyformat
pyformat ist wie format, aber erweitert um die dict-Syntax:
1 cursor.execute('''
2 INSERT INTO my_table (feld1, feld2)
3 VALUES (%(feld1)s, %(feld2)s)
4 ''', {
5 'feld1': 'aaaaaaa',
6 'feld2': None
7 })
qmark
Bei qmark verwendet man ein Fragezeichen als Platzhalter ("Question Mark"):
1 cursor.execute('''
2 SELECT name_last, age
3 FROM people
4 WHERE name_last = ?
5 AND age = ?
6 ''', ('Yeltsin', 72))
named
named sieht :key als Syntax vor und akzeptiert demzufolge ein dict als values-Objekt:
1 who = "Yeltsin"
2 age = 72
3 cursor.execute('''
4 SELECT name_last, age
5 FROM people
6 WHERE name_last = :who
7 AND age = :age
8 ''', dict(
9 who='Yeltsin',
10 age=72
11 ))
Links
DB-API 2.0 die komplette Spezifikation zum Weiterlesen