[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