[Python-de] Formatierung von SQL-Statements

Gerhard Häring gh at ghaering.de
Fre Jul 9 03:26:36 CEST 2004


Mathias Uebel wrote:
>> [Manuelles Quoting bei SQL-Inserts]
>> Ich hab' nicht die ganze Diskussion gelesen, aber gibt es einen Grund,
>> warum das zu Fuß machst, statt die parametrisierte Version von
>> cursor.execute zu nehmen?
>>
> Hallo Holger,
> 
> Bitte erkläre einem Neuling in Sachen Python und SQLite, was Du genau 
> meinst.

/me setzt Hut als PySQLite-Entwickler auf ;-)

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.

 >>> import sqlite
 >>> sqlite.paramstyle
'pyformat'

PyFormat heisst, dass als Platzhalter %s verwendet werden soll [**].

.execute(operation[,parameters])

=> cursor.execute hat zwei Parameter, der erste ist der SQL-String, der 
zweite, optionale, sind die Parameter.

Beispiel:

cu.execute("insert into mytable(a, b) values (%s, %s)", (a, b))

Ganz egal, von welchem Typ die Spalten bzw. Variablen a und b sind, sie 
werden vom DB-API Modul richtig gequotet.

Übrigens wenn du PySQLite verwendest, lade dir bitte die 
Source-Distribution runter und schau mal ins examples/ Verzeichnis. Und 
evtl. auch in doc/rest/ bzw. unter 
http://pysqlite.sourceforge.net/manual.html

Schwieriger wird es, wenn die Anzahl der Spalten bzw. einzufügenden 
Werte nicht im vorhinein bekannt ist bzw. dynamisch ist. Doch auch das 
ist lösbar:

columns = ["a", "b", "c"]
cols = ", ".join(columns)
value_placeholders = ", ".join(["%s"] * len(columns))
values = [3, 5.2, "asdf"]
sql = """
     insert into mytables(%(cols)s)
     values (%(value_placeholders)s))""" % locals()
cursor.execute(sql, values)

Diese ganzen Stringformatierungs-Operatoren sind nicht *ganz so* üblich, 
aber durchaus in der Python-Doku beschrieben ;-)

> Oder hast Du einen guten Link zum nachschauen?

Leider gibt es AFAIK keine gute Einführung in das Programmieren mit der 
DB-API :-(

-- Gerhard

[*] Schwierig für Anfänger, aber ein Muss zu lesen: 
http://python.org/peps/pep-0249.html
[**] Ich will, dass Leute %s verwenden, egal welcher Typ :-P