[Python-de] pypgsql Tabellenamen mit grossbuchstaben nicht erlaubt?

Diez B. Roggisch deets at web.de
Mit Feb 9 00:34:20 CET 2005


> Wenn ich nicht etwas sehr falsch verstanden habe, muß man in dem
> Datentupel auch die in den Daten steckenden Quotes escapen, e.g.:
>
> c.execute(
>     """INSERT INTO breakfast (name, spam, eggs, sausage, price)
>     VALUES (%s, %s, %s, %s, %s)""",
>           ('Spam and Sausage Lover\'s Plate', 5, 1, 8, 7.95 ))
>
> In meinem Fall baue ich den INSERT string on the fly zusammen, und muß
> je nach verwendetem String Quote eben diesen escapen, oder weißt Du
> was besseres?

dein eigenes Beispiel ist das Gegenbeispiel. Der escape ist nur notwendig, 
weil du singlequotes verwendest. Wenn du aber stattdessen doublequotes 
genommen haettest, waers ok ohne escape.

Wenn du aber den String komplett baust, dann
 -  _musst_ du singlequotes verwenden fuer den string parameter selbst
 - das enthaltene s-quote so escapen, das es aus Sicht der DB escaped ist. Das 
kann ein slash sein, oder wie bei oracle ein doppeltes quote. Das ist 
db-spezifisch, und darum nicht standardisiert.

Also etwa so (ungetestet):

"insert into foo (some_string) values ('bar\\'baz')"

Es gibt uebrigens noch einen weiteren, sehr wichtigen Grund die 
parameter-bindende Variante zu waehlen: Zur Ausfuehrung eines Statements 
gehoert nicht nur das eigentliche parsen, sondern insbesondere der sog. 
Execution Plan. Dieser bestimmt, welche Tabellen mit welchen Spalten und 
eventuell Indizes in welcher Reihenfolge abgearbeitet werden. Diesen EP zu 
erstellen kann durchaus aufwendig weil nichttrivial sein. Wenn man jetzt die 
gebundene Variante nutzt, sehen hundert statements trotz verschiedener daten 
aus Sicht der DB immer gleich aus - mit anderen Worten, man kann den EP 
cachen. Und das ist der Performance seeeehr zutraeglich. 

Obiges gilt speziell fuer Oracle, aber ich denke mal auch andere optimierende 
DBs haben aehnliches Mechanismen. 

Natuerlich ist eine weitere Vorraussetzung, das der Treiber die entsprechenden 
calls macht, und nicht intern das oben angedeutete escaping macht - bei 
oracle ist das zb die Verwendung von ocibind.

MfG Diez