Seite 1 von 1
PostgreSQL und Schema
Verfasst: Mo, 20. Mai 2019 13:26
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?
Re: PostgreSQL und Schema
Verfasst: Mo, 20. Mai 2019 15:49
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;
Re: PostgreSQL und Schema
Verfasst: Mo, 20. Mai 2019 18:18
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?
Re: PostgreSQL und Schema
Verfasst: Mo, 20. Mai 2019 20:40
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'"
Re: PostgreSQL und Schema
Verfasst: Mo, 20. Mai 2019 21:08
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.
Re: PostgreSQL und Schema
Verfasst: Mo, 20. Mai 2019 21:17
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 )
Re: PostgreSQL und Schema
Verfasst: Mo, 20. Mai 2019 21:30
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.
Re: PostgreSQL und Schema
Verfasst: Mo, 20. Mai 2019 21:58
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.)
Re: PostgreSQL und Schema
Verfasst: Di, 21. Mai 2019 0:36
von Werner_Bayern
Servus Georg,
ganz einfach, Du musst nur den Namen des Shemas vor Deinem Tabellen-Namen setzen:
oder:
Connect passt, einfach auf die DB, die Du haben möchtest, also in Deinem Fall:
Re: PostgreSQL und Schema
Verfasst: Di, 21. Mai 2019 6:27
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.
Re: PostgreSQL und Schema
Verfasst: Di, 21. Mai 2019 7:19
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!
Re: PostgreSQL und Schema
Verfasst: Di, 21. Mai 2019 8:19
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.....
Re: PostgreSQL und Schema
Verfasst: Di, 21. Mai 2019 8:42
von georg
Hallo, Carlo -
ja, das kann ich bestätigen. Bei MySQL kann ich dann sogar tippen
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 ...
Re: PostgreSQL und Schema
Verfasst: Di, 21. Mai 2019 9:05
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......
Re: PostgreSQL und Schema
Verfasst: Di, 21. Mai 2019 12:26
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
Re: PostgreSQL und Schema
Verfasst: Di, 21. Mai 2019 13:50
von georg
Danke, Carlo -
das werde ich (wohl morgen erst) mal testen.
Re: PostgreSQL und Schema
Verfasst: Do, 23. Mai 2019 12:34
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?
Re: PostgreSQL und Schema
Verfasst: Do, 23. Mai 2019 12:43
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!
Re: PostgreSQL und Schema
Verfasst: Do, 23. Mai 2019 12:53
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:
(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!
Re: PostgreSQL und Schema
Verfasst: Do, 23. Mai 2019 16:38
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....
Re: PostgreSQL und Schema
Verfasst: Do, 23. Mai 2019 17:27
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?
Re: PostgreSQL und Schema
Verfasst: Do, 23. Mai 2019 19:17
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.
Re: PostgreSQL und Schema
Verfasst: Do, 23. Mai 2019 19:43
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....)