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
Hiro2k
sumber
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
Distortum
sumber
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'
chzbrgla
sumber
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.

Kawanan
sumber
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.

Basil Bourque
sumber
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.

beldaz
sumber
3

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

postgres://user:password@host/dbname?sslmode=disable&search_path=schema
Rafael Barros
sumber
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 ...)

AlexSandu75
sumber
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