Чи можливо вказати схему під час підключення до постгресів за допомогою JDBC?


Відповіді:


204

Я знаю, що на це вже відповіли, але я просто зіткнувся з тією ж проблемою, намагаючись вказати схему, яку слід використовувати для командного рядка liquidibase.

Оновлення Станом на 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 , див .: Параметри підключення .
користувач272735

Ви пробували? Тому що він не був вказаний як частина попереднього драйвера, але він все ще працював.
Hiro2k

8
Пробував з 9.3-1101-jdbc41 та 9.1, не працює для мене
Ігнасіо А. Полетті

@ IgnacioA.Poletti Спробуйте скористатися setSchemaметодом JDCB після створення з'єднання. Для мене працює з недавнім драйвером postgres.
beldaz

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

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
Це працювало для мене, спеціально використовуючи для запуску екземпляр "Connection": Statement statement = connection.createStatement(); try { statement.execute("set search_path to '" + schema + "'"); } finally { statement.close(); }
romeara

Існує спосіб вказати схему за замовчуванням у рядку з'єднання (jdbc uri). Відповіді дивіться нижче.
basilikode


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 - псевдонім для значення SET search_path TO. За допомогою цього синтаксису можна вказати лише одну схему.

А оскільки 9.4 та, можливо, більш ранні версії драйвера JDBC, існує підтримка setSchema(String schemaName)методу.


3

У розділі "sql.DB" (зверніть увагу на search_pathпідкреслення):

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

0

На це вже відповіли:

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

Як і в попередніх відповідях, вищезазначений рядок з'єднання просто працює.

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

(Хоча прийняту відповідь було дано 8 років тому, вона була відредагована 1 рік тому.)


1
Чим це відрізняється від прийнятої відповіді 8 років тому?
стдунбар

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