[Python-de] Formatierung von SQL-Statements

Stefan Schwarzer sschwarzer at sschwarzer.net
Die Jul 13 21:02:39 CEST 2004


Hallo Holger,

On Fri, 2004-07-09 13:48:11 +0100, Holger Duerer wrote:
> >>>>> "MU" == Mathias Uebel <mathias.uebel at meeloon.de> writes:
> 
>     MU> Gerhard Häring wrote:
>     MU> [...]
>     MU> Vielen Dank für die Hilfe. Jetzt habe ich das:
>     MU> Um die Spaltenwerte mitzuliefern, habe ich mich für ein Dictionary
>     MU> entschieden.
> 
>     MU>     def SQLInsert( self, table, dict ):           columns = ",
>     MU> ".join(dict.keys())             values = [self.mytime] + dict.values()
>     MU>         placeholders = ", ".join(["%s"] * (len(dict)+1))
>     MU>         sql = """INSERT INTO %(table)s (id,timestamp, %(columns)s)
>     MU>                 VALUES (NULL,%(placeholders)s)""" % locals()
>     MU>         try:
>     MU>             self.cu.execute(sql,values)
>     MU>             self.cx.commit()
> 
>     MU> Das ist sehr schön kurz und ich kann gut flexibel bleiben.

man sollte möglichst nicht Namen verwenden, die bereits im
Builtin-Namespace verwendet werden (hier: dict in der Parameterliste
von SQLInsert).

Python 2.3.4 (#2, Jul 11 2004, 20:47:46)
[GCC 3.3.3 [FreeBSD] 20031106] on freebsd5
Type "help", "copyright", "credits" or "license" for more information.
>>> dict
<type 'dict'>
>>> dict([(1, 2), (3, 4)])
{1: 2, 3: 4}
>>> dict = 5678
>>> dict
5678
>>> del dict
>>> dict([(1, 2), (3, 4)])
{1: 2, 3: 4}
>>> dict
<type 'dict'>

Besonders "interessant" wird es, wenn du dict _zusätzlich_ in seiner
Bedeutung als Builtin-Typ verwenden willst. ;-)

Entsprechendes gilt für für die beliebten Bezeichner list und vars. :-)

> b) bei den Spaltennamen stellst Du 'id' und 'timestamp' (ist das
>    portabel oder würden da andere DBs drüber stolpern, weil das ein
>    Datentyp ist?)

Soweit ich weiß, ist es gültiges SQL, aber man sollte es m. E. eher vermeiden.

Viele Grüße
 Stefan