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