[Python-de] Formatierung von SQL-Statements

Holger Duerer python-lists at duerer-sinclair.de
Fre Jul 9 14:48:11 CEST 2004


>>>>> "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.

Dazu fallen mir zwei Dinge auf:

a) ist denn garantiert, daß dict.keys() und dict.values() Ergebnisse
   in der gleichen Reihenfolge liefern?

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?) explizit heraus; bei den Values, ist nur noch 'id'
   explizit als NULL angegeben aber die timestamp wurde voher schon
   'heimlich' zur Liste 'values' gefügt.

   Wäre es nicht sauberer, alles ins 'dict' zu schreiben und dann den
   Algorithmus wirklich alles machen zu lassen?  

Also beides zusammengenommen vielleicht so:

,----
| def SQLInsert( self, table, dict ):
|     all_items = {}          # wirklich alle
|     all_items.update(dict)  # vom Aufrufer geliefert
|     all_items['id'] = None  # auto-increment
|     all_items['timestamp'] = self.mytime
|     [columns, values] = zip(*all_items.items())
|     columns_text = ", ".join(columns)
|     values_text = ", ".join(["%s"] * (len(values))
|     sql = """INSERT INTO %(table)s (%(columns_text)s)
|             VALUES (%(values_text)s)""" % locals()
|     try:
|         self.cu.execute(sql,values)
|         self.cx.commit()
|     except:
|         ... whatever
`----

        Holger