ฉันจะแสดงรายการฐานข้อมูลและตารางทั้งหมดโดยใช้ psql ได้อย่างไร


1171

ฉันพยายามเรียนรู้การดูแลระบบ PostgreSQL และเริ่มเรียนรู้วิธีใช้psqlเครื่องมือบรรทัดคำสั่ง

เมื่อฉันเข้าสู่ระบบด้วยpsql --username=postgresฉันจะแสดงรายการฐานข้อมูลและตารางทั้งหมดได้อย่างไร

ฉันได้พยายาม\d, dและdS+แต่ไม่มีอะไรที่เป็น บริษัท จดทะเบียน ฉันได้สร้างฐานข้อมูลสองแห่งและตารางสองสามรายการด้วย pgAdmin III ดังนั้นฉันจึงรู้ว่าควรแสดงรายการอยู่


1
หากคุณต้องการเข้าถึงผ่านบรรทัดคำสั่งให้รันpsql -l
adriaan

ความคิดเห็นนี้ควรเป็นคำตอบที่ดีที่สุดอย่างแน่นอน! psql --username=postgres -lหากคุณจำเป็นต้องรับรองความถูกต้องคุณยังสามารถ
Ulysse BN

คำตอบ:


1543

โปรดทราบคำสั่งต่อไปนี้:

  • \listหรือ\l: แสดงรายการฐานข้อมูลทั้งหมด
  • \dt: แสดงรายการตารางทั้งหมดในฐานข้อมูลปัจจุบัน

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

ในการสลับฐานข้อมูล:

\connect database_name หรือ \c database_name

ดูคู่มือเกี่ยวกับpsql


131
คุณสามารถใช้\c db_nameเพื่อเชื่อมต่อกับฐานข้อมูลบางอย่าง
eikes

17
\dtไม่ปรากฏในรายการตารางทั้งหมดในฐานข้อมูลปัจจุบัน (ดูเหมือนว่าจะยกเว้นตารางที่ไม่พบในsearch_pathอย่างน้อยใน 9.2)
Jack Douglas

22
\dt *.จะแสดงรายการตารางทั้งหมดในสกีมาทั้งหมดโดยไม่ต้องแก้ไขพา ธ การค้นหาของคุณ
danpelota

19
\ l + เป็นรายการโปรดของฉัน - แสดงการใช้งานดิสก์เช่นกัน
เลสเตอร์ Cheung

1
ใน Windows ฉันสามารถแสดงรายการฐานข้อมูลด้วยคำสั่งนี้psql -U username -lแต่มันใช้ไม่ได้กับเวอร์ชั่นสแลช
NoName ให้บริการ

350

รายการนี้ฐานข้อมูล:

SELECT datname FROM pg_database
WHERE datistemplate = false;

รายการนี้ตารางในฐานข้อมูลปัจจุบัน

SELECT table_schema,table_name
FROM information_schema.tables
ORDER BY table_schema,table_name;

11
คุณพูดถูก แต่คำถามเกี่ยวกับคำสั่ง meta ของ psql-tool \ dt ง่ายกว่าการพิมพ์ข้อความค้นหาใด ๆ
Frank Heikens

19
ฉันคิดว่านี่เป็นคำตอบที่ยอดเยี่ยมเพราะสามารถเรียกใช้งานได้จากบรรทัดคำสั่ง Linux ซึ่งไม่จำเป็นต้องอยู่ในล่าม psql ซึ่งบางครั้งฉันก็ใช้ ExtraPutty
ความรักและความสงบสุข - Joe Codeswell

2
นอกจากนี้ยังบันทึกวันของฉัน สำหรับกรณีเฉพาะของฉันฉันกำลังเพิ่มWHERE table_schema = 'public'เพราะฉันต้องการวางตารางที่กำหนดเอง
Renra

29
หากคุณเริ่มต้น psql ด้วยแฟล็ก -E มันจะแสดงแบบสอบถามจริงเมื่อคุณใช้คำสั่ง meta
Deebster

นี่เป็นคำตอบที่ดี แม้ว่า OP ต้องการ metacommands แต่ฉันก็เป็น Googling สำหรับเรื่องนี้และมันทำให้ฉันมีคำถามนี้
ทิ้งบัญชี

109

ใน Postgresql คำสั่งเทอร์มินัลเหล่านี้จะแสดงรายการฐานข้อมูลที่มีอยู่

el@defiant$ /bin/psql -h localhost --username=pgadmin --list

หรือคำสั่งระบุไว้เพิ่มเติมเพียง:

psql -U pgadmin -l

คำสั่งเหล่านั้นพิมพ์สิ่งนี้บนเทอร์มินัล:

                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 kurz_prod | pgadmin  | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 pgadmin   | pgadmin  | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(5 rows)

นี่คือฐานข้อมูลที่มีอยู่

ใน PSQL คำสั่งเหล่านี้จะแสดงรายการตารางที่พร้อมใช้งาน

คุณต้องระบุฐานข้อมูลก่อนจึงจะสามารถแสดงรายการตารางในฐานข้อมูลนั้น

el@defiant$ psql -U pgadmin -d kurz_prod

สิ่งนี้จะนำคุณไปสู่เทอร์มินัล psql:

kurz_prod=#

ใช้\dความหมายคำสั่งแสดงตารางมุมมองและลำดับทั้งหมด

kurz_prod=# \d

ภาพพิมพ์นี้:

           List of relations
Schema |  Name   |   Type   |  Owner
--------+---------+----------+---------
public | mytable | table    | pgadmin
public | testing | sequence | pgadmin
(2 rows)

จากนั้นหากต้องการออกจากเทอร์มินัล psql ให้พิมพ์\qและกด Enter หรือCtrl-Dทำสิ่งเดียวกัน นี่คือตารางในฐานข้อมูลนั้น


4
\ d ไม่เพียง แต่ทำรายการตาราง:\d[S+] list tables, views, and sequences
แจ็คดักลาส

3
สำหรับฉันนี่คือคำตอบ "ถูกต้อง" เพราะคุณไม่จำเป็นต้องเชื่อมต่อกับฐานข้อมูลที่มีอยู่แล้ว
aardvarkk


35

ในการรับข้อมูลเพิ่มเติมเกี่ยวกับฐานข้อมูลและรายการตารางคุณสามารถทำได้:

\l+ เพื่อแสดงรายการฐานข้อมูล

                                                                    List of databases
    Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   |  Size   | Tablespace |                Description
------------+----------+----------+-------------+-------------+-----------------------+---------+------------+--------------------------------------------
 pgbench    | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 29 MB   | pg_default |
 postgres   | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 6073 kB | pg_default | default administrative connection database
 slonmaster | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 1401 MB | movespace  |
 slonslave  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 32 MB   | pg_default |
 template0  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +| 5785 kB | pg_default | unmodifiable empty database
            |          |          |             |             | postgres=CTc/postgres |         |            |
 template1  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +| 5985 kB | pg_default | default template for new databases
            |          |          |             |             | postgres=CTc/postgres |         |            |
 test       | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                       | 13 MB   | pg_default |
(7 rows)

และ

\d+ เพื่อแสดงรายการตารางทั้งหมดใน schema search_path ปัจจุบันในฐานข้อมูลปัจจุบัน

test=# \dn+ --list schemas
                          List of schemas
  Name  |  Owner   |  Access privileges   |      Description       
--------+----------+----------------------+------------------------
 public | postgres | postgres=UC/postgres+| standard public schema
        |          | =UC/postgres         | 
schema1 | postgres | postgres=UC/postgres+| 
        |          | =UC/postgres         | 
(2 row)

test=# set search_path to schema1, public;
SET
test=# \d+
                                  List of relations
     Schema  |      Name       | Type  |    Owner     |    Size    | Description
    ---------+-----------------+-------+--------------+------------+-------------
     public  | all_units       | table | postgres     | 0 bytes    |
     public  | asset           | table | postgres     | 16 kB      |
     public  | asset_attribute | table | postgres     | 8192 bytes |
     public  | food            | table | postgres     | 48 kB      |
     public  | name_log        | table | postgres     | 8192 bytes |
     public  | outable         | table | ordinaryuser | 0 bytes    |
     public  | outable2        | table | ordinaryuser | 0 bytes    |
     public  | test            | table | postgres     | 16 kB      |
     public  | usr             | table | postgres     | 5008 kB    |
     schema1 | t1              | table | postgres     | 0 bytes    |
    (10 rows)

33

จาก pg_Admin คุณสามารถรันสิ่งต่อไปนี้บนฐานข้อมูลปัจจุบันของคุณและมันจะได้รับตารางทั้งหมดสำหรับ schema ที่ระบุ:

SELECT * 
FROM information_schema.tables 
WHERE table_type = 'BASE TABLE' 
    AND table_schema = 'public' 
ORDER BY table_type, table_name

นี่จะทำให้คุณเห็นรายการของตารางถาวรทั้งหมด (โดยทั่วไปคือตารางที่คุณกำลังมองหา) คุณจะได้รับเพียงแค่ชื่อตารางถ้าคุณเปลี่ยนสัญลักษณ์แทนเพื่อเพียง* table_nameพับลิกtable_schemaเป็นสกีมาเริ่มต้นสำหรับฐานข้อมูลส่วนใหญ่เว้นแต่ผู้ดูแลระบบของคุณได้ตั้งค่าสคีมาใหม่


3
แม้ว่าสิ่งนี้จะเป็นจริง แต่สิ่งนี้จะพูดถึงไคลเอนต์ที่แตกต่างจากที่ OP ถาม
dezso

สิ่งนี้ใช้งานได้ดีสำหรับฉันและถึงแม้ว่ากรณีการใช้งานของฉันไม่ตรงกับที่ OP ขอ แต่ก็ช่วยให้ฉันได้รับรายชื่อตารางในขณะที่เชื่อมต่อผ่าน wrapper (ในJulialang LibPQ.jl )
Vass

19

เป็นไปได้ว่าคุณได้แทรกตารางลงในสคีมาที่ไม่ได้อยู่ในเส้นทางการค้นหาของคุณหรือค่าเริ่มต้นเช่นสาธารณะและดังนั้นตารางจะไม่แสดงโดยใช้ \ dt หากคุณใช้สคีมาที่เรียกว่าพูดข้อมูลคุณสามารถแก้ไขได้โดยเรียกใช้

alter database <databasename> set search_path=data, public;

ออกและป้อน psql อีกครั้งและตอนนี้ \ dt จะแสดงตารางในข้อมูลสกีมาด้วย


1
ดีที่เรียบง่ายset search_path=data, public;จะทำเคล็ดลับมากเกินไป :)
Dezso

@dezso นั่นทำการเปลี่ยนแปลงอย่างถาวรหรือเพียงแค่ในเซสชัน psql นั้นหรือไม่
John Powell

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