วิธีการเลือกสกีมาใน postgres เมื่อใช้ psql?


151

ฉันมีฐานข้อมูล postgres ที่มีหลายสกีมา เมื่อฉันเชื่อมต่อกับฐานข้อมูลจากเปลือกที่มีpsqlและผมทำงาน\dtจะใช้คีมาเชื่อมต่อเริ่มต้นซึ่งเป็นที่สาธารณะ มีการตั้งค่าสถานะที่ฉันสามารถระบุหรือฉันจะเปลี่ยน schema ได้อย่างไร


คำตอบ:


197

ใน PostgreSQL ระบบจะกำหนดว่าตารางใดมีความหมายโดยทำตามเส้นทางการค้นหาซึ่งเป็นรายการของ schema ที่ต้องการค้นหา

ตารางการจับคู่แรกในเส้นทางการค้นหาจะถูกนำมาเป็นตารางที่ต้องการมิฉะนั้นหากไม่มีข้อผิดพลาดเกิดขึ้นแม้ว่าชื่อตารางที่ตรงกันจะมีอยู่ในสคีมาอื่น ๆ ในฐานข้อมูล

เพื่อแสดงเส้นทางการค้นหาปัจจุบันคุณสามารถใช้คำสั่งต่อไปนี้:

SHOW search_path;

และเมื่อต้องการใส่ schema ใหม่ในเส้นทางคุณสามารถใช้:

SET search_path TO myschema;

หรือถ้าคุณต้องการสกีมาหลายรายการ:

SET search_path TO myschema, public;

การอ้างอิง: https://www.postgresql.org/docs/current/static/ddl-schemas.html


77

คุณต้องการเปลี่ยนฐานข้อมูลหรือไม่?

\l - to display databases
\c - connect to new database

ปรับปรุง

ฉันได้อ่านคำถามของคุณอีกครั้ง เพื่อแสดงสกีมา

\dn - list of schemas

หากต้องการเปลี่ยนสคีมาคุณสามารถลอง

SET search_path TO

1
วิธีการทำเช่นนี้ไม่ได้อยู่ใน psql วิธีการ "เชื่อมต่อ"
mathtick

46
\l - Display database
\c - Connect to database
\dn - List schemas
\dt - List tables inside public schemas
\dt schema1. - List tables inside particular schemas. For eg: 'schema1'.

16
อย่าเป็นเหมือนฉันลืมเกี่ยวกับช่วงเวลาหลังจากชื่อสคีมา :) (ขอบคุณโมฮาเหม็ด!)
Anapaulagomes

1
นี่ไม่ได้ตอบคำถาม เขาถามวิธีเปลี่ยนสกีมาเริ่มต้น ไม่ใช่คำสั่งพื้นฐานสำหรับ psql
Kenny Steegmans

27

ใช้ชื่อสกีมาพร้อมกับจุดในคำสั่ง psql เพื่อรับข้อมูลเกี่ยวกับสคีมานี้

ติดตั้ง:

test=# create schema test_schema;
CREATE SCHEMA
test=# create table test_schema.test_table (id int);
CREATE TABLE
test=# create table test_schema.test_table_2 (id int);
CREATE TABLE

แสดงรายการความสัมพันธ์ในtest_schema:

test=# \dt test_schema.
               List of relations
   Schema    |     Name     | Type  |  Owner   
-------------+--------------+-------+----------
 test_schema | test_table   | table | postgres
 test_schema | test_table_2 | table | postgres
(2 rows)

แสดงtest_schema.test_tableคำจำกัดความ:

test=# \d test_schema.test_table
Table "test_schema.test_table"
 Column |  Type   | Modifiers 
--------+---------+-----------
 id     | integer | 

แสดงตารางทั้งหมดในtest_schema:

test=# \d test_schema.
Table "test_schema.test_table"
 Column |  Type   | Modifiers 
--------+---------+-----------
 id     | integer | 

Table "test_schema.test_table_2"
 Column |  Type   | Modifiers 
--------+---------+-----------
 id     | integer | 

ฯลฯ ...


6
ฉันไม่มีเวลาหลังจาก \ dt test_schema ซึ่งส่งผลให้ "ไม่มีส่วนเกี่ยวข้องพบข้อความ" ขอบคุณสำหรับตัวอย่างที่ทำมันง่ายมาก :)
mehany

14

นี่เป็นรุ่นเก่า แต่ฉันใช้การส่งออกในนามแฝงเพื่อเชื่อมต่อกับฐานข้อมูล:

alias schema_one.con="PGOPTIONS='--search_path=schema_one' psql -h host -U user -d database etc"

และสำหรับสคีอื่น:

alias schema_two.con="PGOPTIONS='--search_path=schema_two' psql -h host -U user -d database etc"

2
ความคิดดี. ฉันจะละเว้นexportและอัฒภาคในนามแฝงของคุณ วิธีนี้PGOPTIONSจะไม่อยู่ต่อหลังจากที่คุณออกจาก psql
Doron Gold

นี่เป็นความคิดที่ยอดเยี่ยมและมีประโยชน์มากกว่าการเพิ่มคำSET search_pathค้นหาทุกข้อ ขอบคุณ!
hraban



0

ถ้าเล่นกับ psql ข้างใน docker exec มันเป็นแบบนี้:

docker exec -e "PGOPTIONS=--search_path=<your_schema>" -it docker_pg psql -U user db_name
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.