[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