Можно ли указать схему при подключении к postgres с JDBC?


Ответы:


204

Я знаю, что на этот вопрос уже был дан ответ, но я столкнулся с той же проблемой, пытаясь указать схему, используемую для командной строки liquibase.

Обновление Начиная с JDBC v 9.4, вы можете указать URL с новым параметром currentSchema следующим образом:

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

Появляется на основе более раннего патча:

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

Какой предложенный URL-адрес выглядит так:

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

2
Да, но на момент написания (конец 2012 г.) он не является частью драйвера 9.1 , см. Параметры подключения .
user272735

Вы пробовали это? Потому что он не был указан как часть предыдущего драйвера, но он все еще работал.
Hiro2k

8
Пробовал с 9.3-1101-jdbc41 и 9.1, у меня не работает
Игнасио А. Полетти

@ IgnacioA.Poletti Попробуйте использовать setSchemaметод JDCB после создания подключения. У меня работает с последним драйвером postgres.
бельдаз

7
Мы решили эту проблему, также используя другой (более новый) драйвер JDBC. В нашем случае postgresql-9.4.1209.jdbc42.jarработали вместе с 9.5базой данных и ?currentSchema=myschemaсинтаксисом.
Себастьян,

63

Начиная с версии 9.4 , вы можете использовать currentSchemaпараметр в строке подключения.

Например:

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

48

Если это возможно в вашей среде, вы также можете установить схему по умолчанию для пользователя в соответствии с желаемой схемой:

ALTER USER user_name SET search_path to 'schema'

1
Возможно, лучше изменить саму базу данных, чтобы один и тот же пользователь мог подключаться к разным базам данных с разными поисковыми путями, если это необходимо: ALTER DATABASE dbname SET search_path TO public, schemaname;
Аляска

44

Я не верю, что есть способ указать схему в строке подключения. Похоже, вы должны выполнить

set search_path to 'schema'

после установления соединения указать схему.


2
Это сработало для меня, в частности использование экземпляра «Соединение» для запуска: Statement statement = connection.createStatement(); try { statement.execute("set search_path to '" + schema + "'"); } finally { statement.close(); }
romeara

Есть способ указать схему по умолчанию в строке подключения (jdbc uri). Смотрите ответы ниже.
Базиликод

7

Я представил обновленную версию патча в драйвер PostgreSQL JDBC, чтобы включить это несколько лет назад. Вам нужно собрать драйвер PostreSQL JDBC из исходного кода (после добавления в патч), чтобы использовать его:

http://archives.postgresql.org/pgsql-jdbc/2008-07/msg00012.php

http://jdbc.postgresql.org/


7

DataSource - setCurrentSchema

При создании DataSourceреализации ищите метод для установки текущей схемы / схемы по умолчанию.

Например, по PGSimpleDataSourceвызову класса 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_" );  // <----------

Если вы оставите схему без указания, Postgres по умолчанию будет использовать схему, названную publicв базе данных. См. Руководство, раздел 5.9.2 Общедоступная схема . Чтобы процитировать шляпу руководство:

В предыдущих разделах мы создавали таблицы без указания имен схем. По умолчанию такие таблицы (и другие объекты) автоматически помещаются в схему с именем «public». Каждая новая база данных содержит такую ​​схему.


3
« попытки подключиться к схеме » - это немного вводит в заблуждение. Драйвер подключается не к схеме, а к базе данных . Какая схема используется запросами, зависит от текущей настройкиsearch_path
a_horse_with_no_name

3

Не забывайте, SET SCHEMA 'myschema'что вы можете использовать в отдельном заявлении

SET SCHEMA 'value' является псевдонимом для SET search_path TO value. С помощью этого синтаксиса можно указать только одну схему.

Начиная с версии 9.4 и, возможно, более ранних версий в драйвере JDBC, существует поддержка setSchema(String schemaName)метода.



0

На это уже ответили:

JDBC: PostgreSQL: // локальный: 5432 / MyDatabase CurrentSchema = MySchema

Как и в предыдущих ответах, приведенная выше строка подключения просто работает.

Я проверил, и все в порядке: https://youtu.be/m0lBUHSLkNM?t=79

(Хотя принятый ответ был дан 8 лет назад, он был отредактирован 1 год назад ...)


1
Чем это отличается от принятого ответа 8 лет назад?
stdunbar

Ну, в комментариях были также сообщения, которые вызывали некоторые сомнения, что это может не сработать. , Итак, я протестировал и опубликовал свой тест в виде видео (я новый участник и пока не могу комментировать ответы других). - также, хотя принятый ответ был дан 8 лет назад, он был отредактирован 1 год назад. , ,
AlexSandu75
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.