Apakah mungkin untuk menentukan skema saat menghubungkan ke postgres dengan JDBC?


Jawaban:


204

Saya tahu ini sudah dijawab, tetapi saya hanya mengalami masalah yang sama mencoba menentukan skema yang akan digunakan untuk baris perintah liquibase.

Pembaruan pada JDBC v 9.4 Anda dapat menentukan url dengan parameter currentSchema baru seperti:

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

Muncul berdasarkan tambalan sebelumnya:

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

Yang diusulkan url seperti:

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

2
Ya tetapi pada saat penulisan (akhir 2012) ini bukan bagian dari driver 9.1 , lihat: Parameter Koneksi .
user272735

Apakah kamu sudah mencobanya? Karena itu tidak terdaftar sebagai bagian dari driver sebelumnya tetapi masih berfungsi.
Hiro2k

8
Mencoba dengan 9.3-1101-jdbc41 dan 9.1, tidak bekerja untuk saya
Ignacio A. Poletti

@ IgnacioA.Poletti Cobalah menggunakan setSchemametode JDCB setelah membuat koneksi Anda. Bekerja untuk saya dengan driver postgres baru-baru ini.
beldaz

7
Kami memecahkan masalah ini dengan juga menggunakan driver JDBC (baru) yang berbeda. Dalam kasus kami postgresql-9.4.1209.jdbc42.jarbekerja sama dengan 9.5database dan ?currentSchema=myschemasintaksis.
SebastianH

63

Pada versi 9.4 , Anda dapat menggunakan currentSchemaparameter dalam string koneksi Anda.

Sebagai contoh:

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

48

Jika memungkinkan di lingkungan Anda, Anda juga dapat mengatur skema default pengguna ke skema yang Anda inginkan:

ALTER USER user_name SET search_path to 'schema'

1
Mungkin lebih baik untuk MENGUBAH database itu sendiri sehingga pengguna yang sama dapat terhubung ke database yang berbeda dengan search_paths yang berbeda jika perlu: ALTER DATABASE SET dbname SET search_path TO public, schemaname;
Alaska

44

Saya tidak percaya ada cara untuk menentukan skema di string koneksi. Tampaknya Anda harus menjalankan

set search_path to 'schema'

setelah koneksi dibuat untuk menentukan skema.


2
Ini bekerja untuk saya, khususnya menggunakan "Koneksi" contoh untuk menjalankan: Statement statement = connection.createStatement(); try { statement.execute("set search_path to '" + schema + "'"); } finally { statement.close(); }
romeara

Ada cara untuk menentukan skema default di string koneksi (jdbc uri). Lihat jawaban di bawah ini.
basilikode


7

DataSource - setCurrentSchema

Saat instantiasi a DataSource implementasi, cari metode untuk mengatur skema saat ini / default.

Misalnya, pada PGSimpleDataSourcepanggilan kelas 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_" );  // <----------

Jika Anda membiarkan skema tidak ditentukan, Postgres default ke skema yang bernama publicdalam database. Lihat manual, bagian 5.9.2 Skema Publik . Mengutip manual topi:

Di bagian sebelumnya kami membuat tabel tanpa menentukan nama skema apa pun. Secara default tabel seperti itu (dan objek lainnya) secara otomatis dimasukkan ke dalam skema bernama "publik". Setiap database baru berisi skema semacam itu.


3
" Upaya untuk terhubung ke skema " - Itu agak menyesatkan. Pengemudi tidak terhubung "ke skema", tetapi ke database . Skema mana yang digunakan oleh kueri tergantung pada pengaturan saat inisearch_path
a_horse_with_no_name

3

Jangan lupa SET SCHEMA 'myschema'yang dapat Anda gunakan dalam Pernyataan terpisah

SET SCHEMA 'value' adalah alias untuk nilai SET search_path TO. Hanya satu skema yang dapat ditentukan menggunakan sintaks ini.

Dan sejak 9.4 dan mungkin versi sebelumnya pada driver JDBC, ada dukungan untuk setSchema(String schemaName)metode ini.


3

In Go with "sql.DB" (perhatikan search_pathdengan garis bawah):

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

0

Ini sudah dijawab:

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

Seperti pada jawaban sebelumnya, string koneksi di atas hanya berfungsi.

Saya sudah memeriksa, dan tidak apa-apa: https://youtu.be/m0lBUHSLkNM?t=79

(Meskipun jawaban yang diterima diberikan 8 tahun yang lalu, itu diedit 1 tahun yang lalu ...)


1
Bagaimana ini berbeda dari jawaban yang diterima dari 8 tahun yang lalu?
stdunbar

Nah, di komentar ada juga posting yang melemparkan beberapa keraguan bahwa itu mungkin tidak berfungsi,. . Jadi saya sudah menguji dan saya memposting tes saya sebagai video (saya anggota baru dan saya belum bisa mengomentari jawaban orang lain). - juga, meskipun jawaban yang diterima diberikan 8 tahun yang lalu, itu diedit 1 tahun yang lalu. . .
AlexSandu75
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.