Alexander (HH): Problem mit Prepared Statement bei Postgres

Beitrag lesen

Moin Moin!

Hallo Alexander,

Ich lege Tabellen- und Spaltennamen an, ohne Quoting zu benutzen. Wie die DB das intern speichert, ist mir völlig egal.

Ich benutze Tabellen- und Spaltennamen in SQL-Statements ohne Quoting, wie
die DB damit intern arbeitet, ist mir völlig egal.

irgendwie drehen wir uns im Kreis :-)
Beispiel:
im Tool pgAdmin lege ich eine Tabelle test an.

Schau an, pgAdmin. Nicht pgAdmin III?

Dann eine Spalte LanguageID

Und was macht pgAdmin III daraus?

Hier kann ich auch noch sagen "Wie das PG intern speichert ist mir völlig egal".

Richtig. Du sagst pgAdmin III aber implizit, dass Du exakt diese Schreibweise haben willst. Das kannst Du im Reiter SQL des Create-Table-Dialogs sehen.

  
CREATE TABLE test  
(  
   "LanguageID" integer  
) WITH (OIDS=FALSE)  
;  

Quoted Identifier, case-sensitiv.

Durch Ausprobieren läßt sich leicht herausfinden, dass (der Create-Table-Dialog in) pgAdmin III nur quotet, was Großbuchstaben (oder Sonderzeichen) enthält:

  
CREATE TABLE test  
(  
   ganz_klein integer,  
   "GANZ_GROSS" integer,  
   "WiLd_GeMiScHt" integer  
) WITH (OIDS=FALSE)  
;  

Aber;
Ein Select im pgAdmin;

select LanguageID from test
bringt dann;
FEHLER:  Spalte »languageid« existiert nicht
LINE 1: select LanguageID from test
               ^

Logisch. Folgefehler des Verhaltens von pgAdmin III.

Das bedeutet ich muss doch meine Spalte LanguageID mit "" quoten.

Nein. Entweder legst Du die Spaltennamen über das Mausschubsertool ausschließlich mit Kleinbuchstaben an, oder du schreibst Dir ein Create-Tables.sql, in dem Du beliebige Schreibweisen benutzen kannst. Das kannst Du dann auch über pgAdmin III ausführen, oder jeden anderen PostgreSQL-Client.

Von daher kapier ich es leider immer noch nicht (sorry für meine lange Leitung) wie du einerseits eine Spalte ala "LanguageID" ansprichst die PG automatisch in "LanguageID" quotet und du in deinem Code LanguagID ohne Quotes ausführst.

Kannst Du mal Deine Begriffe sortieren? Ich führe keine Spalten aus und PG erzeugt keine Quotes.

pgAdmin III erzeugt bei Deiner Arbeitsweise Identifier, die ein Quoten der Identifier im SQL notwendig machen. Letztlich brichst Du die Konvention / Regel, nur ungequotete Identifier zu benutzen.

Schreib Dir die Create-Table-Statements selbst und das Problem ist weg.

  
CREATE TABLE test (  
    LanguageID integer,  
    foo integer,  
    Bar integer,  
    BAZ integer  
);  
  
SELECT lAnGuAgEiD,fOO,bAr,baz FROM test;  

Keine Quotes, keine Probleme.

Alexander

--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".