เป็นไปได้หรือไม่ที่จะระบุสกีมาเมื่อเชื่อมต่อกับ 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

2
ใช่ แต่ในขณะที่เขียน (ปลายปี 2012) มันไม่ได้เป็นส่วนหนึ่งของไดรเวอร์ 9.1ให้ดู: พารามิเตอร์การเชื่อมต่อ
272735

คุณลองหรือยัง เพราะมันไม่ได้อยู่ในรายการเป็นส่วนหนึ่งของไดรเวอร์ก่อนหน้า แต่ก็ยังใช้งานได้
Hiro2k

8
พยายามกับ 9.3-1101-jdbc41 และ 9.1 ไม่ได้ผลสำหรับฉัน
Ignacio A. Poletti

@ IgnacioA.Poletti ลองใช้setSchemaวิธีJDCB หลังจากสร้างการเชื่อมต่อของคุณ ใช้งานได้สำหรับฉันด้วยไดรเวอร์ postgres เมื่อเร็ว ๆ นี้
beldaz

7
เราแก้ไขปัญหานี้โดยใช้ไดร์เวอร์ JDBC (ใหม่กว่า) ที่แตกต่างกัน ในกรณีของเราpostgresql-9.4.1209.jdbc42.jarทำงานร่วมกับ9.5ฐานข้อมูลและ?currentSchema=myschemaไวยากรณ์
SebastianH

63

ในเวอร์ชัน 9.4คุณสามารถใช้currentSchemaพารามิเตอร์ในสตริงการเชื่อมต่อของคุณ

ตัวอย่างเช่น:

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

48

หากเป็นไปได้ในสภาพแวดล้อมของคุณคุณสามารถกำหนดสคีมาเริ่มต้นของผู้ใช้เป็นสคีมาที่คุณต้องการได้:

ALTER USER user_name SET search_path to 'schema'

1
น่าจะดีกว่าที่จะแก้ไขฐานข้อมูลของตัวเองเพื่อให้ผู้ใช้เดียวกันสามารถเชื่อมต่อกับฐานข้อมูลที่แตกต่างกันด้วย search_paths ที่แตกต่างกันถ้าจำเป็นต้องมี: แก้ไขฐานข้อมูล dbname SET search_path ต่อสาธารณะ schemaname;
อลาสก้า

44

ฉันไม่เชื่อว่ามีวิธีการระบุสคีมาในสตริงการเชื่อมต่อ ดูเหมือนว่าคุณจะต้องดำเนินการ

set search_path to 'schema'

หลังจากทำการเชื่อมต่อเพื่อระบุสคีมา


2
สิ่งนี้ใช้ได้กับฉันโดยใช้อินสแตนซ์ "การเชื่อมต่อ" เพื่อเรียกใช้: Statement statement = connection.createStatement(); try { statement.execute("set search_path to '" + schema + "'"); } finally { statement.close(); }
romeara

มีวิธีการระบุสกีมาเริ่มต้นในสตริงการเชื่อมต่อ (jdbc uri) ดูคำตอบด้านล่าง
basilikode

7

ฉันส่งแพตช์เวอร์ชั่นที่อัปเดตแล้วไปยังไดรเวอร์ PostgreSQL JDBC เพื่อให้ใช้งานได้ไม่กี่ปีมานี้ คุณจะต้องสร้างไดรเวอร์ PostreSQL JDBC จากแหล่ง (หลังจากเพิ่มในชุดข้อมูลแก้ไข) เพื่อใช้งาน:

http://archives.postgresql.org/pgsql-jdbc/2008-07/msg00012.php

http://jdbc.postgresql.org/


7

DataSource - setCurrentSchema

เมื่ออินสแตนซ์DataSourceการนำไปใช้งานให้ค้นหาวิธีการตั้งค่าสคีมาปัจจุบัน / เริ่มต้น

ยกตัวอย่างเช่นในการเรียกร้องระดับPGSimpleDataSourcesetCurrentSchema

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 ประชาชน Schema วิธีอ้างคู่มือหมวก:

ในส่วนก่อนหน้าเราสร้างตารางโดยไม่ระบุชื่อสกีมาใด ๆ โดยค่าเริ่มต้นตารางดังกล่าว (และวัตถุอื่น ๆ ) จะถูกใส่ลงใน schema ชื่อ "สาธารณะ" โดยอัตโนมัติ ทุกฐานข้อมูลใหม่จะมีสคีมาดังกล่าว


3
" ความพยายามที่จะเชื่อมต่อกับสคีมา " - นั่นเป็นเรื่องเข้าใจผิดเล็กน้อย คนขับรถไม่เชื่อมต่อ "เพื่อคี" แต่ในฐานข้อมูล สคีมาใดที่ใช้โดยการสืบค้นขึ้นอยู่กับการตั้งค่าปัจจุบันของsearch_path
a_horse_with_no_name

3

อย่าลืมSET SCHEMA 'myschema'ว่าคุณสามารถใช้อะไรในแถลงการณ์แยกต่างหาก

SET SCHEMA 'value' เป็นนามแฝงสำหรับค่า SET search_path TO สามารถระบุได้เพียงหนึ่งสกีมาโดยใช้ไวยากรณ์นี้

และตั้งแต่ 9.4 และอาจเป็นเวอร์ชั่นก่อนหน้าบนไดร์เวอร์ JDBC จึงมีการรองรับsetSchema(String schemaName)เมธอด



0

สิ่งนี้ได้รับคำตอบแล้ว:

JDBC: PostgreSQL: // localhost: 5432 / mydatabase currentSchema = myschema

เช่นเดียวกับในคำตอบก่อนหน้าสตริงการเชื่อมต่อด้านบนใช้งานได้

ฉันได้ตรวจสอบแล้วและก็ตกลง: https://youtu.be/m0lBUHSLkNM?t=79

(แม้ว่าคำตอบที่ได้รับจะได้รับเมื่อ 8 ปีที่แล้ว แต่ถูกแก้ไขเมื่อ 1 ปีที่แล้ว)


1
สิ่งนี้แตกต่างจากคำตอบที่ยอมรับเมื่อ 8 ปีที่แล้วหรือไม่
stdunbar

ในความคิดเห็นยังมีการโพสต์ที่ทำให้เกิดข้อสงสัยว่ามันอาจจะไม่ทำงาน,. . ดังนั้นฉันจึงทดสอบและฉันโพสต์การทดสอบของฉันเป็นวิดีโอ (ฉันเป็นสมาชิกใหม่และฉันยังไม่สามารถแสดงความคิดเห็นในคำตอบของผู้อื่นได้) - เช่นกันแม้ว่าจะได้รับคำตอบเมื่อ 8 ปีที่ผ่านมา แต่ก็มีการแก้ไขเมื่อ 1 ปีที่แล้ว . .
AlexSandu75
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.