[Python-de] Formatierung von SQL-Statements

Mathias Uebel mathias.uebel at meeloon.de
Don Jul 8 01:05:20 CEST 2004


Gerhard Häring wrote:

> 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: 

Nur zu. Ich bin wissbegierig!

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

Okay, ich habe nachgelesen.
Es stimmt: ab 2.3.4 braucht man nur noch ein NULL in die 
PrimaryKey-Spalte zu schreiben und erhält dann automatisch autoincrement.

> 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: 

Ja, das habe ich auf der Seite, die mir Daniel empfahl, auch gelesen.
Die haben das so gemacht:
if value isinstance(value,str): ....
Es werden aber in dieser Klasse solche Eventualitäten nicht auftauchen.
Natürlich werde ich das ansonsten berücksichtigen.

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

Stimmt! Schon entsorgt!

Grusz Mathias

-- 
Lieber lachende Pinguine als tanzende Büroklammern!

CU in www.meeloon.de
--