Можно ли указать схему при подключении к 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
Hiro2k
источник
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
Distortum
источник
48

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

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

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

set search_path to 'schema'

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

Herks
источник
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)метода.

beldaz
источник
3

В Go с "sql.DB" (обратите внимание на search_pathподчеркивание):

postgres://user:password@host/dbname?sslmode=disable&search_path=schema
Рафаэль Баррос
источник
0

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

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

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

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

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

AlexSandu75
источник
1
Чем это отличается от принятого ответа 8 лет назад?
stdunbar
Ну, в комментариях были также сообщения, которые вызывали некоторые сомнения, что это может не сработать. , Итак, я протестировал и опубликовал свой тест в виде видео (я новый участник и пока не могу комментировать ответы других). - также, хотя принятый ответ был дан 8 лет назад, он был отредактирован 1 год назад. , ,
AlexSandu75