PostgreSQL und Schema

Hier dreht es sich um den PostGre Server

Moderator: Moderatoren

Antworten
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

PostgreSQL und Schema

Beitrag von georg »

Hallo,


wie verbinde ich zu einem Schema in einer bestimmten Datenbank?

Also:

Code: Alles auswählen

Server (localhost)
+---> Datenbank (meintest)
      +---> public (Schema, standardmässig vorhanden)
      +---> test (manuell erstelltes Schema)
            +---> meinetabelle
            
Wie verbinde ich zu meintest/test/meinetabelle?

Eine Verbindung der Art

Code: Alles auswählen

DBE=pgdbe;server=localhost;db=meintest;schema=test;uid=postgres
wird zwar akzeptiert (d.h. es wird eine Verbindung hergestellt), aber nur mit dem Standard-Schema "public". Wie verbinde ich zu meinem gewünschten Zielschema?
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: PostgreSQL und Schema

Beitrag von ramses »

MIt der PDDBE arbeite ich nicht mehr, da kenne ich die Sytax auch nicht.
Nativ geht es so: "schema.table"
Versuche doch mal : ...;db=schema.table;
Valar Morghulis

Gruss Carlo
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: PostgreSQL und Schema

Beitrag von georg »

Hallo, Carlo -


das habe ich in verschiedenen Varianten mal durchgespielt, aber nichts davon klappt. Aber auf jeden Fall danke für den Hinweis auf die Syntax.

Du schreibst "mit der PGDBE arbeite ich nicht mehr" - was verwendest Du heute?
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: PostgreSQL und Schema

Beitrag von AUGE_OHR »

georg hat geschrieben: Mo, 20. Mai 2019 13:26 wie verbinde ich zu einem Schema in einer bestimmten Datenbank?
wie wäre das

Code: Alles auswählen

         ::cQuery := "SELECT table_name FROM information_schema.tables " + ;
                     "WHERE table_schema = 'MySchema'"
gruss by OHR
Jimmy
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: PostgreSQL und Schema

Beitrag von georg »

Hallo, Jimmy -


das ist nicht, was ich meine.

Normalerweise ist eine SQL-Datenbank so aufgebaut, dass es innerhalb des Servers Datenbanken gibt, und innerhalb der Datenbank dann Tabellen.

Bei PostgreSQL ist das ein wenig anders, dort gibt es unterhalb der Datenbank dann erst ein Schema (nicht mit dem information_schema zu verwechseln). Standardmässig heisst dieses Schema "public". Wenn Du nichts besonderes tust, erstellst Du Deine Tabellen etc. immer in diesem Schema, und mit diesem Schema wird auch standardmässig verbunden. Soweit alles paletti.

Nun habe ich in meinem Fall eine Datenbank mit mehreren Schemata, und die pgdbe verbindet sich (zumindest bis jetzt und hier bei mir) ausschliesslich mit dem Schema "public". Ich will aber mit dem Schema "Klaus", "Egon" oder "Fritz" arbeiten.

Dein Beispiel liefert mir die Beschreibung einer/der Tabelle(n) aus dem Schema, aber ich will auf die Daten selbst zugreifen können.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: PostgreSQL und Schema

Beitrag von AUGE_OHR »

georg hat geschrieben: Mo, 20. Mai 2019 21:08 Dein Beispiel liefert mir die Beschreibung einer/der Tabelle(n) aus dem Schema, aber ich will auf die Daten selbst zugreifen können.
ok nächster Versuch

Code: Alles auswählen

   ::oTable := oPG:Select( "pg_tables",, "schemaname = 'MySchema'" )

METHOD PGSql:Select( cTable, cField, cWhere, cOrder, cLimit, cOffset )                                       
LOCAL cSql

   DEFAULT cField TO "*"
   DEFAULT cWhere TO ""
   DEFAULT cOrder TO ""
   DEFAULT cLimit TO ""                                    
   DEFAULT cOffset TO ""                                  

   cSql := "SELECT " + cField + " FROM " + cTable

   IF !EMPTY( cWhere )
      cSql := cSql + " WHERE " + cWhere
   ENDIF
   IF !EMPTY( cOrder )
      cSql := cSql + " ORDER BY " + cOrder
   ENDIF
   IF !EMPTY( cLimit )                                      
      cSql := cSql + " LIMIT " + cLimit
   ENDIF
   IF !EMPTY( cOffset )                                     
      cSql := cSql + " OFFSET " + cOffset
   ENDIF

   ::exec( cSql )

   ::Result:cField := cField
   ::Result:cTable := cTable
   ::Result:cOrder := cOrder
   ::Result:cWhere := cWhere

   ::Result:cLimit := cLimit                                
   ::Result:cOffset := cOffset                             

RETURN ( ::Result )
gruss by OHR
Jimmy
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: PostgreSQL und Schema

Beitrag von georg »

Hallo, Jimmy -


es sollte entweder so:

Code: Alles auswählen

   cConStr := "DBE=pgdbe;server=localhost;db=meinedb.meinschema;uid=postgres;pwd=geheim"
   oSession := DacSession():new(cConStr)
   IF !(oSession:isConnected())
      ConfirmBox(, "Keine Verbindung möglich", "Fehler", XBPMB_OK, XBPMB_CRITICAL)
      QUIT
   ENDIF

   cSelect := "INSERT INTO meinetabelle VALUES(1, 'Klaus Maierbär', '12345')"
   lError := oSession:executeStatement(cSelect)
oder so:

Code: Alles auswählen

   cConStr := "DBE=pgdbe;server=localhost;db=meinedb;uid=postgres;pwd=geheim"
   oSession := DacSession():new(cConStr)
   IF !(oSession:isConnected())
      ConfirmBox(, "Keine Verbindung möglich", "Fehler", XBPMB_OK, XBPMB_CRITICAL)
      QUIT
   ENDIF

   cSelect := "INSERT INTO meinschema.meinetabelle VALUES(1, 'Klaus Maierbär', '12345')"
   lError := oSession:executeStatement(cSelect)
laufen.

Auch das habe ich versucht:

Code: Alles auswählen

   cConStr := "DBE=pgdbe;server=localhost;db=meinedb;schema=meinschema;uid=postgres;pwd=geheim"
   oSession := DacSession():new(cConStr)
   IF !(oSession:isConnected())
      ConfirmBox(, "Keine Verbindung möglich", "Fehler", XBPMB_OK, XBPMB_CRITICAL)
      QUIT
   ENDIF

   cSelect := "INSERT INTO meinetabelle VALUES(1, 'Klaus Maierbär', '12345')"
   lError := oSession:executeStatement(cSelect)
Geht auch nicht, wobei ich nun nicht weiss, ob ungültige Schlüsselworte im ConnectionString ignoriert werden, denn dann würde es dem ersten Beispiel entsprechen.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: PostgreSQL und Schema

Beitrag von ramses »

Hallo Georg

ich verwende mit einer eigenen Klasse nur noch direkt die Funktionen aus der libpq.dll

Hast du beim anlegen des Schemas auch die Zugrifsrechte "Privileges" korrekt vergeben?

Funktioniert dein Befehl

Code: Alles auswählen

INSERT INTO meinschema.meinetabelle (FELDNAME1, FELDNAME2,FELDNAME3) VALUES(1, 'Klaus Maierbär', '12345');
wenn du diesen direkt in pgAdmin ausführst?
(Du weisst aber schon dass dein Befehl in deinem Muster unvollständig ist? Die Feldnamen fehlen.)
Valar Morghulis

Gruss Carlo
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: PostgreSQL und Schema

Beitrag von Werner_Bayern »

Servus Georg,

ganz einfach, Du musst nur den Namen des Shemas vor Deinem Tabellen-Namen setzen:

Code: Alles auswählen

Select * from test.meinetabelle LIMIT 1
oder:

Code: Alles auswählen

update test.meinetabelle SET ...
Connect passt, einfach auf die DB, die Du haben möchtest, also in Deinem Fall:

Code: Alles auswählen

DB=meintest
es grüßt

Werner

<when the music is over, turn off the lights!>
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: PostgreSQL und Schema

Beitrag von ramses »

Hallo Werner

wenn es Georg mit den Beispielen versucht die er gepostet hat wird es sicher nie funktionieren.
In seiner Zeile die ausführen will fehlen die Feldnamen in welche er die Werte (Values) einsetzen will.
Valar Morghulis

Gruss Carlo
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: PostgreSQL und Schema

Beitrag von georg »

Hallo,


danke erst einmal für die Rückmeldung.

@Carlo: wenn Du in einer INSERT-Anweisung ALLE Felder einer Tabelle mit Werten versiehst, brauchst Du KEINE Feldnamen anzugeben. Die Reihenfolge der Werte in der VALUES-Anweisung muss jedoch der Reihenfolge der Felddefinition der Tabelle entsprechen. Gut hier im Syntax-Diagramm zu erkennen: https://www.postgresql.org/docs/9.5/sql-insert.html

@Werner: werde ich im Laufe des Tages mal ausprobieren, aber ich gehe davon aus, dass die Berechtigungen stimmen (ein Benutzer (= postgres)). Aber ich werde berichten!
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: PostgreSQL und Schema

Beitrag von ramses »

Hallo Georg

da hast du tatsächlich recht. Bitte entschuldige!

Meine erste Spalte jeder Tabelle ist immer die ID vom Typ serial, der automatisch belegt wird. Da geht es natürlich auch nicht einfach so ohne Feldnamen.....
Valar Morghulis

Gruss Carlo
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: PostgreSQL und Schema

Beitrag von georg »

Hallo, Carlo -


ja, das kann ich bestätigen. Bei MySQL kann ich dann sogar tippen

Code: Alles auswählen

INSERT INTO meineTabelle VALUES(NULL, ...)
wenn die erste Spalte als PRIMARY KEY und AUTO_INCREMENT definiert ist - dann ersetzt MySQL das NULL durch den nächsten, eindeutigen Schlüssel. PostgreSQL ist da deutlich unverträglicher ...
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: PostgreSQL und Schema

Beitrag von ramses »

Hallo Georg
PostgreSQL ist da deutlich unverträglicher ...
NIcht unverträglicher, ich finde das korrekt und absolut richtig. Es hilft Fehler zu vermeiden......
Valar Morghulis

Gruss Carlo
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: PostgreSQL und Schema

Beitrag von ramses »

Hallo Georg

der folgende Code legt in der Datenbank ein Schema, eine Tabelle und ein Datensatz an.

Code: Alles auswählen

procedure main 
   
   IF !Dbeload( "PGDBE", .F. )
     Alert( "PGDBE could not be loaded!" )
   ENDIF
   DbeSetDefault( "PGDBE" )

   cConStr := "DBE=pgdbe;server=192.168.10.4;db=passwords;uid=postgres;pwd=postgres"
   oSession := DacSession():new(cConStr)
   IF !(oSession:isConnected())
      ConfirmBox(, "Keine Verbindung möglich", "Fehler", XBPMB_OK, XBPMB_CRITICAL)
      QUIT
   ENDIF
  
   cSelect := "CREATE SCHEMA meinschema AUTHORIZATION postgres"
   lisOK   := oSession:executeStatement(cSelect)

   cSelect := "CREATE TABLE meinschema.meinetabelle ( nummer integer default 0, name character varying(300) default '', plz character(10) default '')"
   lisOK   := oSession:executeStatement(cSelect)

   cSelect := "INSERT INTO meinschema.meinetabelle VALUES(1, 'Klaus Maierbär', '12345')"
   lisOK   := oSession:executeStatement(cSelect)
Der zum Test verwendete Server ist die Version 11.3
Valar Morghulis

Gruss Carlo
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: PostgreSQL und Schema

Beitrag von georg »

Danke, Carlo -


das werde ich (wohl morgen erst) mal testen.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: PostgreSQL und Schema

Beitrag von Werner_Bayern »

georg hat geschrieben: Di, 21. Mai 2019 7:19 @Werner: werde ich im Laufe des Tages mal ausprobieren, aber ich gehe davon aus, dass die Berechtigungen stimmen (ein Benutzer (= postgres)). Aber ich werde berichten!
Servus Georg,

und, funktioniert es so bei Dir?
es grüßt

Werner

<when the music is over, turn off the lights!>
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: PostgreSQL und Schema

Beitrag von georg »

Hallo, Werner -


wie das Leben so spielt - ich bin noch nicht dazu gekommen, weil andere Aufgaben Vorrang heuchelten - aber ich gehe es gleich mal an. Danke für die Erinnerung!
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: PostgreSQL und Schema

Beitrag von georg »

Hallo,


so, gerade durchgespielt:

Code: Alles auswählen

   cConStr := "DBE=pgdbe;server=localhost;db=rushhour;uid=postgres;pwd=xxx"
   oSession := DacSession():new(cConStr)
   IF !(oSession:isConnected())
      ConfirmBox(, "Keine Verbindung möglich", "Fehler", XBPMB_OK, XBPMB_CRITICAL)
      QUIT
   ENDIF

   cSelect := "INSERT INTO randomclass.petermann VALUES(1, 'Klaus Maierbär', '12345')"
   lError := oSession:executeStatement(cSelect)
   cError := oSession:getLastMessage()
lError liefert ein .F. zurück, während cError dies behauptet:

Code: Alles auswählen

FEHLER:  Relation »randomclass.petermann« existiert nicht
LINE 1: INSERT INTO randomclass.petermann VALUES(1, 'Klaus Maierbär'...
                    ^
Dabei ist eigentlich alles da: Bild

(Gross-/Kleinschreibung macht keinen Unterschied.)

So, dann habe ich mal gegooglet, und es so probiert:

Code: Alles auswählen

   cSelect := 'INSERT INTO "RandomClass"."petermann"' + " VALUES(1, 'Klaus Maierbär', '12345')"
Das Problem besteht wohl darin, dass PostgreSQL den Schemanamen in Kleinbuchstaben umwandelt (siehe Fehlermeldung), dann aber den Schemanamen casesensitivie vergleicht. Wer hätte das gedacht ...

Dann hat es funktioniert. Vielen Dank an alle, die mitgeholfen haben!
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: PostgreSQL und Schema

Beitrag von ramses »

Hallo Georg

jetzt wo du es sagts ..... Wenn du das Schema aus dem Programm anlegst wird alles in Kleinbuchstaben gewandelt und alles ist ok.
Beim anlegen des Schemas mit dem Admin-Programm hingegen nicht. Dann müssen die Namen in " gesetzt werden....
Valar Morghulis

Gruss Carlo
Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2120
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern
Hat sich bedankt: 29 Mal
Danksagung erhalten: 70 Mal

Re: PostgreSQL und Schema

Beitrag von Werner_Bayern »

Servus,

ja, hätte ich auch gleich schreiben können: Zur Sicherheit immer alles klein bei PostgreSQL. Sorry.

Du machst ja viel mit SQL-Express? Hast schon mal getestet, ob es relevante Performance-Unterschiede zu PostgreSQL gibt?
es grüßt

Werner

<when the music is over, turn off the lights!>
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: PostgreSQL und Schema

Beitrag von georg »

Hallo, Werner -


nein, inzwischen mache ich weniger mit SQLExpress, eigentlich habe ich es in den letzten drei, vier Jahren nicht mehr verwendet.

Für Excel verwende ich AutomationObject(), und für MySQL den Wrapper von Hector.

Leider fehlt mir hier im Moment die Zeit, Zeitmessungen durchzuführen - ich muss die Daten bereitstellen, damit der nächste sich dann um die Konsolidierung kümmern kann.

Aber ich werde wohl auch ein paar Versuche mit Hector's Wrapper für PostgreSQL machen.

Aber Freunde werden PostgreSQL und ich nicht.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 12 Mal
Danksagung erhalten: 77 Mal

Re: PostgreSQL und Schema

Beitrag von ramses »

Hallo Georg
Aber Freunde werden PostgreSQL und ich nicht.
Das dachte ich am Anfang auch. Alle Datenbanken haben so Ihre Besonderheiten. Nach den Anfangschwierigkeiten kann ich mir aber mittlerweile nichts anderes mehr vorstellen! Nur den Mut nicht verlieren! (Und alle Namen grundsätzlich klein schreiben....)
Valar Morghulis

Gruss Carlo
Antworten