Ist es möglich, das Schema anzugeben, wenn mit JDBC eine Verbindung zu Postgres hergestellt wird?

Antworten:

204

Ich weiß, dass dies bereits beantwortet wurde, aber ich bin auf dasselbe Problem gestoßen, als ich versucht habe, das Schema anzugeben, das für die Liquibase-Befehlszeile verwendet werden soll.

Update Ab JDBC 9.4 können Sie die URL mit dem neuen Parameter currentSchema wie folgt angeben:

jdbc:postgresql://localhost:5432/mydatabase?currentSchema=myschema

Erscheint basierend auf einem früheren Patch:

http://web.archive.org/web/20141025044151/http://postgresql.1045698.n5.nabble.com/Patch-to-allow-setting-schema-search-path-in-the-connectionURL-td2174512. html

Welche vorgeschlagene URL ist so:

jdbc:postgresql://localhost:5432/mydatabase?searchpath=myschema
Hiro2k
quelle
2
Ja, aber zum Zeitpunkt des Schreibens (Ende 2012) ist es nicht Teil des 9.1-Treibers , siehe: Verbindungsparameter .
user272735
Hast Du es versucht? Weil es nicht als Teil des vorherigen Treibers aufgeführt war, aber trotzdem funktionierte.
Hiro2k
8
Versucht mit 9.3-1101-jdbc41 und 9.1, funktioniert nicht für mich
Ignacio A. Poletti
@ IgnacioA.Poletti Versuchen Sie, die JDCB- setSchemaMethode zu verwenden, nachdem Sie Ihre Verbindung hergestellt haben. Funktioniert für mich mit einem aktuellen Postgres-Treiber.
Beldaz
7
Wir haben dieses Problem gelöst, indem wir auch einen anderen (neueren) JDBC-Treiber verwendet haben. In unserem Fall postgresql-9.4.1209.jdbc42.jarmit einer 9.5Datenbank und der ?currentSchema=myschemaSyntax zusammengearbeitet.
SebastianH
63

Ab Version 9.4 können Sie den currentSchemaParameter in Ihrer Verbindungszeichenfolge verwenden.

Beispielsweise:

jdbc:postgresql://localhost:5432/mydatabase?currentSchema=myschema
Distortum
quelle
48

Wenn dies in Ihrer Umgebung möglich ist, können Sie auch das Standardschema des Benutzers auf das gewünschte Schema festlegen:

ALTER USER user_name SET search_path to 'schema'
chzbrgla
quelle
1
Wahrscheinlich ist es besser, die Datenbank selbst zu ändern, damit derselbe Benutzer bei Bedarf eine Verbindung zu verschiedenen Datenbanken mit unterschiedlichen Suchpfaden herstellen kann: ALTER DATABASE Datenbankname SET search_path TO public, schemaname;
Alaska
44

Ich glaube nicht, dass es eine Möglichkeit gibt, das Schema in der Verbindungszeichenfolge anzugeben. Es scheint, dass Sie ausführen müssen

set search_path to 'schema'

Nachdem die Verbindung hergestellt wurde, geben Sie das Schema an.

Herks
quelle
2
Dies funktionierte für mich, insbesondere unter Verwendung der "Connection" Statement statement = connection.createStatement(); try { statement.execute("set search_path to '" + schema + "'"); } finally { statement.close(); }
-Instanz
Es gibt eine Möglichkeit, das Standardschema in der Verbindungszeichenfolge (jdbc uri) anzugeben. Siehe Antworten unten.
Basilikode
7

DataSource - - setCurrentSchema

Suchen Sie beim Instanziieren einer DataSourceImplementierung nach einer Methode zum Festlegen des aktuellen / Standardschemas.

Zum Beispiel beim PGSimpleDataSourceKlassenaufruf setCurrentSchema.

org.postgresql.ds.PGSimpleDataSource dataSource = new org.postgresql.ds.PGSimpleDataSource ( );
dataSource.setServerName ( "localhost" );
dataSource.setDatabaseName ( "your_db_here_" );
dataSource.setPortNumber ( 5432 );
dataSource.setUser ( "postgres" );
dataSource.setPassword ( "your_password_here" );
dataSource.setCurrentSchema ( "your_schema_name_here_" );  // <----------

Wenn Sie das Schema nicht angegeben lassen, verwendet Postgres standardmäßig ein publicin der Datenbank benanntes Schema . Siehe Handbuch, Abschnitt 5.9.2 Das öffentliche Schema . Um das Handbuch zu zitieren:

In den vorherigen Abschnitten haben wir Tabellen ohne Angabe von Schemanamen erstellt. Standardmäßig werden solche Tabellen (und andere Objekte) automatisch in ein Schema mit dem Namen "public" eingefügt. Jede neue Datenbank enthält ein solches Schema.

Basil Bourque
quelle
3
" versucht, eine Verbindung zu einem Schema herzustellen " - Das ist etwas irreführend. Der Treiber stellt keine Verbindung zu einem Schema her, sondern zu einer Datenbank . Welches Schema von Abfragen verwendet wird, hängt von der aktuellen Einstellung dessearch_path
a_horse_with_no_name
3

Vergessen SET SCHEMA 'myschema'Sie nicht, welche Sie in einer separaten Erklärung verwenden könnten

SET SCHEMA 'value' ist ein Alias ​​für den Wert SET search_path TO. Mit dieser Syntax kann nur ein Schema angegeben werden.

Und seit 9.4 und möglicherweise früheren Versionen des JDBC-Treibers wird die setSchema(String schemaName)Methode unterstützt.

beldaz
quelle
3

In Go mit "sql.DB" (beachten Sie den search_pathmit Unterstrich):

postgres://user:password@host/dbname?sslmode=disable&search_path=schema
Rafael Barros
quelle
0

Dies wurde bereits beantwortet:

jdbc: postgresql: // localhost: 5432 / mydatabase? currentSchema = myschema

Wie in den vorherigen Antworten funktioniert die obige Verbindungszeichenfolge einfach.

Ich habe es überprüft und es ist in Ordnung: https://youtu.be/m0lBUHSLkNM?t=79

(Obwohl die akzeptierte Antwort vor 8 Jahren gegeben wurde, wurde sie vor 1 Jahr bearbeitet ...)

AlexSandu75
quelle
1
Wie unterscheidet sich das von der akzeptierten Antwort von vor 8 Jahren?
stdunbar
Nun, in den Kommentaren gab es auch Beiträge, die Zweifel aufkommen ließen, dass es möglicherweise nicht funktioniert. . Also habe ich getestet und meinen Test als Video gepostet (ich bin ein neues Mitglied und kann die Antworten anderer noch nicht kommentieren). - Obwohl die akzeptierte Antwort vor 8 Jahren gegeben wurde, wurde sie vor 1 Jahr bearbeitet. . .
AlexSandu75