Có thể chỉ định lược đồ khi kết nối với postgres với JDBC không?


Câu trả lời:


204

Tôi biết điều này đã được trả lời, nhưng tôi chỉ gặp vấn đề tương tự khi cố gắng chỉ định lược đồ sẽ sử dụng cho dòng lệnh liquidibase.

Cập nhật Kể từ JDBC v 9.4, bạn có thể chỉ định url với tham số currentSchema mới như vậy:

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

Xuất hiện dựa trên một bản vá trước đó:

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

Các url được đề xuất như vậy:

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

2
Có nhưng tại thời điểm viết (cuối năm 2012), nó không phải là một phần của trình điều khiển 9.1 , xem: Thông số kết nối .
dùng272735

Bạn đã thử à? Bởi vì nó không được liệt kê như một phần của trình điều khiển trước nhưng nó vẫn hoạt động.
Hiro2k

8
Đã thử với 9.3-1101-jdbc41 và 9.1, không hoạt động với tôi
Ignacio A. Poletti

@ IgnacioA.Poletti Hãy thử sử dụng setSchemaphương pháp JDCB sau khi tạo kết nối của bạn. Làm việc cho tôi với một trình điều khiển postgres gần đây.
beldaz

7
Chúng tôi đã giải quyết vấn đề này bằng cách sử dụng trình điều khiển JDBC khác (mới hơn). Trong trường hợp của chúng tôi postgresql-9.4.1209.jdbc42.jarđã làm việc cùng với một 9.5cơ sở dữ liệu và ?currentSchema=myschemacú pháp.
SebastianH

63

Kể từ phiên bản 9.4 , bạn có thể sử dụng currentSchematham số trong chuỗi kết nối của mình.

Ví dụ:

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

48

Nếu có thể trong môi trường của bạn, bạn cũng có thể đặt lược đồ mặc định của người dùng thành lược đồ mong muốn của mình:

ALTER USER user_name SET search_path to 'schema'

1
Có lẽ tốt hơn để THAY ĐỔI cơ sở dữ liệu để cùng một người dùng có thể kết nối với các cơ sở dữ liệu khác nhau với các search_path khác nhau nếu cần: ALTER DATABASE dbname SET search_path TO public, schemaname;
Alaska

44

Tôi không tin có một cách để xác định lược đồ trong chuỗi kết nối. Có vẻ như bạn phải thực thi

set search_path to 'schema'

sau khi kết nối được thực hiện để xác định lược đồ.


2
Điều này làm việc với tôi, cụ thể là sử dụng ví dụ "Kết nối" để chạy: Statement statement = connection.createStatement(); try { statement.execute("set search_path to '" + schema + "'"); } finally { statement.close(); }
romeara

Có một cách để xác định lược đồ mặc định trong chuỗi kết nối (jdbc uri). Xem câu trả lời dưới đây.
basilikode


7

DataSource - setCurrentSchema

Khi khởi tạo một DataSourcetriển khai, hãy tìm một phương thức để đặt lược đồ hiện tại / mặc định.

Ví dụ, trong PGSimpleDataSourcecuộc gọi lớp 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_" );  // <----------

Nếu bạn để lược đồ không xác định, Postgres mặc định là lược đồ có tên publictrong cơ sở dữ liệu. Xem hướng dẫn, phần 5.9.2 Lược đồ công cộng . Để báo giá hướng dẫn sử dụng mũ:

Trong các phần trước, chúng ta đã tạo các bảng mà không chỉ định bất kỳ tên lược đồ nào. Theo mặc định, các bảng như vậy (và các đối tượng khác) sẽ tự động được đưa vào một lược đồ có tên là công khai. Mỗi cơ sở dữ liệu mới chứa một lược đồ như vậy.


3
" Cố gắng kết nối với một lược đồ " - Đó là một chút sai lệch. Trình điều khiển không kết nối "với một lược đồ", nhưng với một cơ sở dữ liệu . Lược đồ nào được sử dụng bởi các truy vấn tùy thuộc vào cài đặt hiện tại củasearch_path
a_horse_with_no_name

3

Đừng quên SET SCHEMA 'myschema'những gì bạn có thể sử dụng trong một Tuyên bố riêng

SET SCHema 'value' là bí danh cho giá trị SET search_path TO. Chỉ có một lược đồ có thể được chỉ định bằng cú pháp này.

Và kể từ phiên bản 9,4 và có thể trước đó trên trình điều khiển JDBC, có hỗ trợ cho setSchema(String schemaName)phương thức này.


3

Trong Go với "sql.DB" (lưu ý search_pathvới dấu gạch dưới):

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

0

Điều này đã được trả lời:

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

Như trong các câu trả lời trước, chuỗi kết nối ở trên chỉ hoạt động.

Tôi đã kiểm tra và không sao: https://youtu.be/m0lBUHSLkNM?t=79

(Mặc dù câu trả lời được chấp nhận đã được đưa ra 8 năm trước, nhưng nó đã được chỉnh sửa 1 năm trước ..)


1
Điều này khác với câu trả lời được chấp nhận từ 8 năm trước như thế nào?
stdunbar

Vâng, trong các bình luận cũng có những bài viết đang đặt ra một số nghi ngờ rằng nó có thể không hoạt động ,. . Vì vậy, tôi đã thử nghiệm và tôi đã đăng bài kiểm tra của mình dưới dạng video (Tôi là thành viên mới và tôi chưa thể nhận xét về câu trả lời của người khác). - cũng vậy, mặc dù câu trả lời được chấp nhận đã được đưa ra 8 năm trước, nó đã được chỉnh sửa 1 năm trước. . .
AlexSandu75
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.