Czy można określić schemat podczas łączenia się z postgres z JDBC?

Odpowiedzi:

204

Wiem, że już na to odpowiedziano, ale właśnie napotkałem ten sam problem, próbując określić schemat, który ma być używany dla wiersza poleceń liquibase.

Aktualizacja Od wersji JDBC w wersji 9.4 można określić adres URL za pomocą nowego parametru currentSchema w następujący sposób:

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

Pojawia się na podstawie wcześniejszej łatki:

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

Który proponowany adres URL jest taki:

jdbc:postgresql://localhost:5432/mydatabase?searchpath=myschema
Hiro2k
źródło
2
Tak, ale w chwili pisania tego tekstu (koniec 2012 r.) Nie jest częścią sterownika 9.1 , patrz: Parametry połączenia .
user272735,
Próbowałeś tego? Ponieważ nie był wymieniony jako część poprzedniego sterownika, ale nadal działał.
Hiro2k
8
Próbowałem z 9.3-1101-jdbc41 i 9.1, nie działa dla mnie
Ignacio A.Poletti
@ IgnacioA.Poletti Spróbuj użyć setSchemametody JDCB po utworzeniu połączenia. Działa dla mnie z najnowszym sterownikiem postgres.
beldaz
7
Rozwiązaliśmy ten problem, używając również innego (nowszego) sterownika JDBC. W naszym przypadku postgresql-9.4.1209.jdbc42.jarwspółpracował z 9.5bazą danych i ?currentSchema=myschemaskładnią.
SebastianH
63

Od wersji 9.4 można użyć currentSchemaparametru w parametrach połączenia.

Na przykład:

jdbc:postgresql://localhost:5432/mydatabase?currentSchema=myschema
Distortum
źródło
48

Jeśli jest to możliwe w Twoim środowisku, możesz również ustawić domyślny schemat użytkownika na żądany schemat:

ALTER USER user_name SET search_path to 'schema'
chzbrgla
źródło
1
Prawdopodobnie lepiej ZMIENIĆ samą bazę danych, aby ten sam użytkownik mógł w razie potrzeby łączyć się z różnymi bazami danych z różnymi ścieżkami wyszukiwania: ALTER DATABASE nazwa_bazy danych SET ścieżka_wyszukiwania TO public, nazwa_schematu;
Alaska,
44

Nie wierzę, że istnieje sposób na określenie schematu w parametrach połączenia. Wygląda na to, że musisz wykonać

set search_path to 'schema'

po nawiązaniu połączenia w celu określenia schematu.

Herks
źródło
2
To zadziałało dla mnie, szczególnie przy użyciu instancji „Connection” do uruchomienia: Statement statement = connection.createStatement(); try { statement.execute("set search_path to '" + schema + "'"); } finally { statement.close(); }
romeara
Istnieje sposób, aby określić domyślny schemat w parametrach połączenia (jdbc uri). Zobacz odpowiedzi poniżej.
basilikode
7

DataSource - setCurrentSchema

Podczas tworzenia wystąpienia DataSourceimplementacji poszukaj metody ustawiania bieżącego / domyślnego schematu.

Na przykład podczas PGSimpleDataSourcerozmowy klasowej 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_" );  // <----------

Jeśli pozostawisz schemat nieokreślony, Postgres domyślnie używa schematu nazwanego publicw bazie danych. Zobacz podręcznik, rozdział 5.9.2 Schemat publiczny . Cytując instrukcję kapelusza:

W poprzednich sekcjach utworzyliśmy tabele bez określania nazw schematów. Domyślnie takie tabele (i inne obiekty) są automatycznie umieszczane w schemacie o nazwie „public”. Każda nowa baza danych zawiera taki schemat.

Basil Bourque
źródło
3
próby połączenia się ze schematem ” - to trochę mylące. Sterownik nie łączy się „ze schematem”, ale z bazą danych . Który schemat jest używany przez zapytania, zależy od aktualnego ustawieniasearch_path
a_horse_with_no_name,
3

Nie zapomnij, SET SCHEMA 'myschema'którego możesz użyć w osobnej instrukcji

SET SCHEMA 'wartość' jest aliasem dla SET ścieżka_wyszukiwania TO wartość. Przy użyciu tej składni można określić tylko jeden schemat.

Od wersji 9.4 i prawdopodobnie wcześniejszych wersji sterownika JDBC istnieje obsługa tej setSchema(String schemaName)metody.

beldaz
źródło
3

W Idź z „sql.DB” (zwróć uwagę na search_pathpodkreślenie):

postgres://user:password@host/dbname?sslmode=disable&search_path=schema
Rafael Barros
źródło
0

To już odpowiedź:

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

Podobnie jak w poprzednich odpowiedziach, powyższe parametry połączenia po prostu działają.

Sprawdziłem i jest OK: https://youtu.be/m0lBUHSLkNM?t=79

(Chociaż zaakceptowanej odpowiedzi udzielono 8 lat temu, została ona zredagowana rok temu.).

AlexSandu75
źródło
1
Czym różni się to od przyjętej odpowiedzi sprzed 8 lat?
stdunbar
Cóż, w komentarzach były też posty, które budziły wątpliwości, czy to może nie zadziałać,. . Przetestowałem więc i opublikowałem swój test jako film (jestem nowym członkiem i nie mogę jeszcze komentować odpowiedzi innych). - również, mimo że akceptowana odpowiedź została udzielona 8 lat temu, została zredagowana rok temu. . .
AlexSandu75