Czy to możliwe? Czy mogę to określić w adresie URL połączenia? Jak to zrobić?
Czy to możliwe? Czy mogę to określić w adresie URL połączenia? Jak to zrobić?
Odpowiedzi:
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:
Który proponowany adres URL jest taki:
jdbc:postgresql://localhost:5432/mydatabase?searchpath=myschema
setSchema
metody JDCB po utworzeniu połączenia. Działa dla mnie z najnowszym sterownikiem postgres.
postgresql-9.4.1209.jdbc42.jar
współpracował z 9.5
bazą danych i ?currentSchema=myschema
składnią.
Od wersji 9.4 można użyć currentSchema
parametru w parametrach połączenia.
Na przykład:
jdbc:postgresql://localhost:5432/mydatabase?currentSchema=myschema
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'
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.
Statement statement = connection.createStatement(); try { statement.execute("set search_path to '" + schema + "'"); } finally { statement.close(); }
Przesłałem zaktualizowaną wersję poprawki do sterownika PostgreSQL JDBC, aby umożliwić to kilka lat temu. Będziesz musiał zbudować sterownik PostreSQL JDBC ze źródła (po dodaniu łatki), aby go używać:
http://archives.postgresql.org/pgsql-jdbc/2008-07/msg00012.php
DataSource
- setCurrentSchema
Podczas tworzenia wystąpienia DataSource
implementacji poszukaj metody ustawiania bieżącego / domyślnego schematu.
Na przykład podczas PGSimpleDataSource
rozmowy 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 public
w 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.
search_path
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.
W Idź z „sql.DB” (zwróć uwagę na search_path
podkreślenie):
postgres://user:password@host/dbname?sslmode=disable&search_path=schema
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.).