[Python-de] Formatierung von SQL-Statements

Gerhard Häring gh at ghaering.de
Mit Jul 7 23:56:06 CEST 2004


Mathias Uebel wrote:
> Hallo Daniel,
> Danke für den Tip! Ich habe mir die Quelle angesehen und jetzt 
> funktioniert Folgendes:

Ok, mal ein bischen Kritik:

> 
>    def SQLInsert( self, table, list ):
>        # SQL String
>        SQL=[]
>        SQL.append("INSERT INTO ")
>        SQL.append(table)
>        SQL.append(" VALUES((SELECT max(id) FROM Buchung)+1,'")

Statt MAX(id) solltest du TRIGGER verwenden, welche eine eindeutige ID 
automatisch einfügen. Unter PostgreSQL funktioniert das am einfachsten, 
indem du der ID-Spalte den Typ SERIAL zuweist. PostgreSQL erzeugt den 
Rest dann automatisch.

Unter SQLite gibst du der Spalte den Typ "INTEGER PRIMARY KEY" und gut ist.

Unter MySQL INTEGER PRIMARY KEY AUTO_INCREMENT, wenn ich mich recht 
entsinne.

Den Wert für die ID-Spalte lässt du dann einfach weg. Du musst dann aber 
alle Spalte aufführen, ausser der ID-Spalte:

     insert into bla(col1, col2, ...) values (...)

Bei MySQL/Oracle/... kannst du für die ID-Spalte auch NULL verwenden. 
Bei PostgreSQL/SQLite musst du sie weglassen. Doh!

>        SQL.append(self.mytime)
>        SQL.append("',")
>        vv = []
>        for item in list:
>            item = "'",item,"'"

Was passiert wenn item einen Apostroph enthält? Nur z. B. ... Besser so:

def _quote(value):
     # dieser Code sollte irgendwann mal Python 2.1-kompatibel sein ;)
     from types import *
     if value is None:
         return 'NULL'
     elif type(value) in (IntType, LongType, FloatType):
         return value
     elif isinstance(value, StringType):
         return "'%s'" % value.replace("'", "''")
     else:
         raise ValueError

item = _quote(item)

>            item = "".join(item)

Häh, wozu das? Höchst überflüssig IMO.

>            vv.append(item)
>        SQL.append(",".join(vv))
>        SQL.append(")")
>        SQL = "".join(SQL)
>        try:
>            self.cu.execute(SQL)
>            self.cx.commit()

HTH,

-- Gerhard