È possibile specificare lo schema durante la connessione a Postgres con JDBC?


Risposte:


204

So che è stata già fornita una risposta, ma ho riscontrato lo stesso problema nel tentativo di specificare lo schema da utilizzare per la riga di comando liquibase.

Aggiornamento A partire da JDBC v 9.4 è possibile specificare l'URL con il nuovo parametro currentSchema in questo modo:

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

Appare basato su una patch precedente:

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

Che ha proposto l'URL in questo modo:

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

2
Sì, ma al momento della stesura (fine 2012) non fa parte del driver 9.1 , vedere: Parametri di connessione .
user272735

Hai provato? Perché non era elencato come parte del driver precedente ma funzionava ancora.
Hiro2k,

8
Provato con 9.3-1101-jdbc41 e 9.1, non funziona per me
Ignacio A. Poletti,

@ IgnacioA.Poletti Prova a utilizzare il setSchemametodo JDCB dopo aver creato la connessione. Funziona per me con un driver Postgres recente.
Beldaz,

7
Abbiamo risolto questo problema utilizzando anche un driver JDBC diverso (più recente). Nel nostro caso abbiamo postgresql-9.4.1209.jdbc42.jarcollaborato con un 9.5database e la ?currentSchema=myschemasintassi.
Sebastian

63

A partire dalla versione 9.4 , è possibile utilizzare il currentSchemaparametro nella stringa di connessione.

Per esempio:

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

48

Se è possibile nel tuo ambiente, puoi anche impostare lo schema predefinito dell'utente sullo schema desiderato:

ALTER USER user_name SET search_path to 'schema'

1
Probabilmente è meglio ALTER il database stesso in modo che lo stesso utente possa connettersi a database diversi con percorsi di ricerca diversi, se necessario: ALTER DATABASE dbname SET search_path TO public, schemaname;
Alaska,

44

Non credo che ci sia un modo per specificare lo schema nella stringa di connessione. Sembra che devi eseguire

set search_path to 'schema'

dopo aver effettuato la connessione per specificare lo schema.


2
Questo ha funzionato per me, in particolare utilizzando l'istanza "Connessione" per eseguire: Statement statement = connection.createStatement(); try { statement.execute("set search_path to '" + schema + "'"); } finally { statement.close(); }
romeara

C'è un modo per specificare lo schema predefinito nella stringa di connessione (jdbc uri). Vedi le risposte sotto.
basilikode,


7

DataSource - setCurrentSchema

Quando si crea un'istanza di DataSourceun'implementazione, cercare un metodo per impostare lo schema corrente / predefinito.

Ad esempio, durante la PGSimpleDataSourcechiamata di classe 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_" );  // <----------

Se lo schema non viene specificato, Postgres imposta automaticamente uno schema denominato publicall'interno del database. Vedere il manuale, sezione 5.9.2 Schema pubblico . Per citare il manuale del cappello:

Nelle sezioni precedenti abbiamo creato tabelle senza specificare alcun nome di schema. Per impostazione predefinita, tali tabelle (e altri oggetti) vengono automaticamente inseriti in uno schema denominato "pubblico". Ogni nuovo database contiene un tale schema.


3
" tenta di connettersi a uno schema " - È un po 'fuorviante. Il driver non si connette "a uno schema", ma a un database . Lo schema utilizzato dalle query dipende dall'impostazione corrente disearch_path
a_horse_with_no_name

3

Non dimenticare SET SCHEMA 'myschema'quale potresti usare in una Dichiarazione separata

SET SCHEMA 'valore' è un alias per valore SET search_path TO. Solo uno schema può essere specificato usando questa sintassi.

E dalla versione 9.4 e forse versioni precedenti sul driver JDBC, esiste il supporto per il setSchema(String schemaName)metodo.


3

In Vai con "sql.DB" (nota il carattere search_pathdi sottolineatura con):

postgres://user:password@host/dbname?sslmode=disable&search_path=schema

0

Questo è stato già risposto:

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

Come nelle risposte precedenti, la stringa di connessione sopra funziona.

Ho controllato ed è OK: https://youtu.be/m0lBUHSLkNM?t=79

(Sebbene la risposta accettata sia stata data 8 anni fa, è stata modificata 1 anno fa...)


1
In che modo differisce dalla risposta accettata di 8 anni fa?
stdunbar,

Bene, nei commenti c'erano anche dei post che sollevavano dubbi sul fatto che potrebbe non funzionare,. . Quindi ho testato e ho pubblicato il mio test come video (sono un nuovo membro e non posso ancora commentare le risposte degli altri). - Inoltre, sebbene la risposta accettata sia stata data 8 anni fa, è stata modificata 1 anno fa. . .
AlexSandu75,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.