PostgreSQL und Schema

Alles zum PostgreSQL-Server

Moderator: Moderatoren

Antworten
georg
Foren-Administrator
Foren-Administrator
Beiträge: 2430
Registriert: Fr, 08. Feb 2008 21:29

PostgreSQL und Schema

Beitrag von georg » Mo, 20. Mai 2019 13:26

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
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.

ramses
Programmier-Gott
Programmier-Gott
Beiträge: 1444
Registriert: Mi, 28. Jul 2010 17:16

Re: PostgreSQL und Schema

Beitrag von ramses » Mo, 20. Mai 2019 15:49

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
Foren-Administrator
Foren-Administrator
Beiträge: 2430
Registriert: Fr, 08. Feb 2008 21:29

Re: PostgreSQL und Schema

Beitrag von georg » Mo, 20. Mai 2019 18:18

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
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12032
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: PostgreSQL und Schema

Beitrag von AUGE_OHR » Mo, 20. Mai 2019 20:40

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
Foren-Administrator
Foren-Administrator
Beiträge: 2430
Registriert: Fr, 08. Feb 2008 21:29

Re: PostgreSQL und Schema

Beitrag von georg » Mo, 20. Mai 2019 21:08

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
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12032
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg

Re: PostgreSQL und Schema

Beitrag von AUGE_OHR » Mo, 20. Mai 2019 21:17

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
Foren-Administrator
Foren-Administrator
Beiträge: 2430
Registriert: Fr, 08. Feb 2008 21:29

Re: PostgreSQL und Schema

Beitrag von georg » Mo, 20. Mai 2019 21:30

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
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.

ramses
Programmier-Gott
Programmier-Gott
Beiträge: 1444
Registriert: Mi, 28. Jul 2010 17:16

Re: PostgreSQL und Schema

Beitrag von ramses » Mo, 20. Mai 2019 21:58

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: 1678
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

Re: PostgreSQL und Schema

Beitrag von Werner_Bayern » Di, 21. Mai 2019 0:36

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 euch

Werner

ramses
Programmier-Gott
Programmier-Gott
Beiträge: 1444
Registriert: Mi, 28. Jul 2010 17:16

Re: PostgreSQL und Schema

Beitrag von ramses » Di, 21. Mai 2019 6:27

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
Foren-Administrator
Foren-Administrator
Beiträge: 2430
Registriert: Fr, 08. Feb 2008 21:29

Re: PostgreSQL und Schema

Beitrag von georg » Di, 21. Mai 2019 7:19

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
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.

ramses
Programmier-Gott
Programmier-Gott
Beiträge: 1444
Registriert: Mi, 28. Jul 2010 17:16

Re: PostgreSQL und Schema

Beitrag von ramses » Di, 21. Mai 2019 8:19

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
Foren-Administrator
Foren-Administrator
Beiträge: 2430
Registriert: Fr, 08. Feb 2008 21:29

Re: PostgreSQL und Schema

Beitrag von georg » Di, 21. Mai 2019 8:42

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
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.

ramses
Programmier-Gott
Programmier-Gott
Beiträge: 1444
Registriert: Mi, 28. Jul 2010 17:16

Re: PostgreSQL und Schema

Beitrag von ramses » Di, 21. Mai 2019 9:05

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
Programmier-Gott
Programmier-Gott
Beiträge: 1444
Registriert: Mi, 28. Jul 2010 17:16

Re: PostgreSQL und Schema

Beitrag von ramses » Di, 21. Mai 2019 12:26

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
Foren-Administrator
Foren-Administrator
Beiträge: 2430
Registriert: Fr, 08. Feb 2008 21:29

Re: PostgreSQL und Schema

Beitrag von georg » Di, 21. Mai 2019 13:50

Danke, Carlo -


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

Georg S. Lorrig
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.

Benutzeravatar
Werner_Bayern
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1678
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

Re: PostgreSQL und Schema

Beitrag von Werner_Bayern » Do, 23. Mai 2019 12:34

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 euch

Werner

georg
Foren-Administrator
Foren-Administrator
Beiträge: 2430
Registriert: Fr, 08. Feb 2008 21:29

Re: PostgreSQL und Schema

Beitrag von georg » Do, 23. Mai 2019 12:43

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
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.

georg
Foren-Administrator
Foren-Administrator
Beiträge: 2430
Registriert: Fr, 08. Feb 2008 21:29

Re: PostgreSQL und Schema

Beitrag von georg » Do, 23. Mai 2019 12:53

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
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.

ramses
Programmier-Gott
Programmier-Gott
Beiträge: 1444
Registriert: Mi, 28. Jul 2010 17:16

Re: PostgreSQL und Schema

Beitrag von ramses » Do, 23. Mai 2019 16:38

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: 1678
Registriert: Sa, 30. Jan 2010 22:58
Wohnort: Niederbayern

Re: PostgreSQL und Schema

Beitrag von Werner_Bayern » Do, 23. Mai 2019 17:27

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 euch

Werner

georg
Foren-Administrator
Foren-Administrator
Beiträge: 2430
Registriert: Fr, 08. Feb 2008 21:29

Re: PostgreSQL und Schema

Beitrag von georg » Do, 23. Mai 2019 19:17

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
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.

ramses
Programmier-Gott
Programmier-Gott
Beiträge: 1444
Registriert: Mi, 28. Jul 2010 17:16

Re: PostgreSQL und Schema

Beitrag von ramses » Do, 23. Mai 2019 19:43

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