ฉันจะแสดงรายการสกีมาทั้งหมดใน PostgreSQL ได้อย่างไร


239

เมื่อใช้ PostgreSQL v9.1 ฉันจะแสดงรายการสกีมาทั้งหมดที่ใช้ SQL ได้อย่างไร

ฉันคาดหวังบางอย่างตามสายของ:

SELECT something FROM pg_blah;

คำตอบ:


259

ในการแสดงรายการสกีมาทั้งหมดให้ใช้ (ANSI) มาตรฐาน INFORMATION_SCHEMA

select schema_name
from information_schema.schemata;

รายละเอียดเพิ่มเติมในคู่มือ

อีกทางเลือกหนึ่ง:

select nspname
from pg_catalog.pg_namespace;

รายละเอียดเพิ่มเติมเกี่ยวกับ pg_catalog ในคู่มือ


250

เมื่อใช้บรรทัดคำสั่งคุณอาจแสดงรายการสคีทั้งหมดที่มีคำสั่งpsql\dn


ขอบคุณ คงจะดีถ้ามี schemas ที่ส่งคืนโดย \ dn แต่ในกรณีนี้ฉันเขียนแอพ bootstrap ที่เชื่อมต่อโดยใช้ libpq / libpqxx ดังนั้นฉันจึงไม่สามารถเข้าถึง CLI ได้
Stéphane

1
schemas คืออะไรที่\dnแสดงรายการซึ่งตรงข้ามกับตารางที่\dtแสดงรายการ
Tommy

8
@Tommy \dtแสดงตารางสำหรับสคีมาสาธารณะ ในการแสดงตารางของ schemas ทุกการใช้งานและสำหรับการใช้งานคีมาโดยเฉพาะอย่างยิ่ง\dt *.* \dt schema_name.*
ร้ายแรง

@Tommy schema เป็นเนมสเปซ: คุณอาจมีตารางที่แตกต่างกันซึ่งมีชื่อเดียวกันในเนมสเปซที่ต่างกัน
eppesuig

38

เชื่อมต่อกับคำสั่ง psql -> psql --u {userName} {DBName} จากนั้นคุณสามารถพิมพ์คำสั่งด้านล่างเพื่อตรวจสอบว่ามีสกีมากี่รายการใน DB

DBName=# \dn

มิฉะนั้นคุณสามารถตรวจสอบไวยากรณ์โดยขั้นตอนด้านล่างได้อย่างง่ายดาย -

  1. หลังจากเชื่อมต่อฐานข้อมูลแล้วให้กด

    DBName=# help

คุณจะได้รับตัวเลือกด้านล่าง:

คุณกำลังใช้ psql ซึ่งเป็นอินเตอร์เฟสบรรทัดคำสั่งไปยัง PostgreSQL
ประเภท: \ ลิขสิทธิ์สำหรับข้อตกลงการกระจาย
\ h สำหรับความช่วยเหลือเกี่ยวกับคำสั่ง SQL
\? สำหรับความช่วยเหลือเกี่ยวกับคำสั่ง psql
\ g หรือยุติด้วยเครื่องหมายอัฒภาคเพื่อเรียกใช้งานแบบสอบถาม
\ q เพื่อออก

จากนั้นกด

DBName=# \?

คุณจะได้รับตัวเลือกทั้งหมดอย่างง่ายดาย


9

การเริ่มต้นบน postgres 9.3 หนึ่งเคล็ดลับที่คุณสามารถใช้ใน postgres เพื่อรับ sql ที่แน่นอนของคำสั่งที่ให้ข้อมูล (เช่น \ d, \ du, \ dp, ฯลฯ ) ใน psql คือการใช้ทรานแซคชัน นี่คือวิธีที่หลอกลวง เปิดหนึ่งเซสชัน postgres จากนั้นพิมพ์คำสั่งของคุณ:

begin;
\dn+

ในขณะที่ธุรกรรมยังทำงานอยู่ให้เปิดเซสชัน postgres อีกครั้งและสอบถาม pg_stat_activity และคุณจะได้รับ sql ที่แน่นอน

postgres=# select query from pg_stat_activity ;
                                 query                                 
-----------------------------------------------------------------------
 SELECT n.nspname AS "Name",                                          +
   pg_catalog.pg_get_userbyid(n.nspowner) AS "Owner",                 +
   pg_catalog.array_to_string(n.nspacl, E'\n') AS "Access privileges",+
   pg_catalog.obj_description(n.oid, 'pg_namespace') AS "Description" +
 FROM pg_catalog.pg_namespace n                                       +
 WHERE n.nspname !~ '^pg_' AND n.nspname <> 'information_schema'      +
 ORDER BY 1;

12
คุณไม่จำเป็นต้องหลอกมัน เพิ่งจะเปิด\set ECHO_HIDDEN on
Nick Barnes

8
หรือเรียกใช้เป็นpsql -E
Evan Carroll
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.