Làm cách nào để liệt kê tất cả các cơ sở dữ liệu và bảng bằng psql?


1171

Tôi đang cố gắng học quản trị PostgreSQL và đã bắt đầu học cách sử dụng psqlcông cụ dòng lệnh.

Khi tôi đăng nhập psql --username=postgres, làm cách nào để liệt kê tất cả các cơ sở dữ liệu và bảng?

Tôi đã cố gắng \d, ddS+nhưng không được liệt kê. Tôi đã tạo hai cơ sở dữ liệu và một vài bảng với pgAdmin III, vì vậy tôi biết chúng nên được liệt kê.


1
Nếu bạn muốn truy cập nó thông qua dòng lệnh, hãy chạypsql -l
adriaan

Nhận xét này chắc chắn nên là một trong những câu trả lời hàng đầu! Nếu bạn cần auth bạn cũng có thể psql --username=postgres -l.
Ulysse BN

Câu trả lời:


1543

Xin lưu ý các lệnh sau:

  • \listhoặc \l: liệt kê tất cả các cơ sở dữ liệu
  • \dt: liệt kê tất cả các bảng trong cơ sở dữ liệu hiện tại

Bạn sẽ không bao giờ nhìn thấy các bảng trong cơ sở dữ liệu khác, những bảng này không hiển thị. Bạn phải kết nối với cơ sở dữ liệu chính xác để xem các bảng của nó (và các đối tượng khác).

Để chuyển đổi cơ sở dữ liệu:

\connect database_name hoặc là \c database_name

Xem hướng dẫn về psql .


131
Bạn có thể sử dụng \c db_nameđể kết nối với một cơ sở dữ liệu nhất định.
eike

17
\dtkhông xuất hiện để liệt kê tất cả các bảng trong cơ sở dữ liệu hiện tại (dường như loại trừ những bảng không tìm thấy trong search_pathít nhất vào ngày 9.2)
Jack Douglas

22
\dt *.sẽ liệt kê tất cả các bảng trong tất cả các lược đồ mà không phải sửa đổi đường dẫn tìm kiếm của bạn.
danpelota

19
\ l + là sở thích của tôi - nó cũng hiển thị việc sử dụng đĩa.
Lester Cheung

1
Trên Windows tôi có thể liệt kê các cơ sở dữ liệu bằng lệnh này psql -U username -lnhưng nó không hoạt động với phiên bản gạch chéo.
NoNameProvided 6/10/2015

350

Danh sách này liệt kê các cơ sở dữ liệu:

SELECT datname FROM pg_database
WHERE datistemplate = false;

Danh sách này liệt kê các bảng trong cơ sở dữ liệu hiện tại

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

11
Bạn nói đúng, nhưng câu hỏi là về các lệnh meta của công cụ psql. \ dt dễ dàng hơn nhiều so với việc nhập bất kỳ truy vấn nào.
Frank Heikens

19
Tôi nghĩ rằng đây là một câu trả lời TUYỆT VỜI vì nó có thể được thực thi từ một dòng lệnh Linux trái ngược với việc cần phải có trong trình thông dịch psql mà đôi khi bị treo đối với tôi khi sử dụng ExtraPutty.
Tình yêu và hòa bình - Joe Codwell

2
Cũng tiết kiệm trong ngày của tôi. Đối với trường hợp cụ thể của tôi, tôi đang thêm WHERE table_schema = 'public'vì tôi muốn bỏ chỉ các bảng tùy chỉnh.
Renra

29
Nếu bạn khởi động psql bằng cờ -E, nó sẽ hiển thị truy vấn thực khi bạn sử dụng lệnh meta.
Deebster

Đây là một câu trả lời tốt. Mặc dù OP muốn các metacommands, tôi đã làm điều này và điều đó dẫn tôi đến câu hỏi này.
Vứt bỏ tài khoản

109

Trong Postgresql các lệnh đầu cuối này liệt kê các cơ sở dữ liệu có sẵn

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

Hoặc lệnh được nêu đơn giản hơn:

psql -U pgadmin -l

Những lệnh này in trên thiết bị đầu cuối:

                                  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)

Đây là những cơ sở dữ liệu có sẵn.

Trong PSQL, các lệnh này liệt kê các bảng có sẵn

Bạn phải chỉ định một cơ sở dữ liệu trước khi bạn có thể liệt kê các bảng trong cơ sở dữ liệu đó.

el@defiant$ psql -U pgadmin -d kurz_prod

Điều này đưa bạn đến một thiết bị đầu cuối psql:

kurz_prod=#

Sử dụng \dý nghĩa lệnh hiển thị tất cả các bảng, dạng xem và trình tự

kurz_prod=# \d

Bản in này:

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

Sau đó, để thoát khỏi thiết bị đầu cuối psql, gõ \qvà nhấn enter. Hoặc Ctrl-Dlàm điều tương tự. Đây là các bảng trong cơ sở dữ liệu đó.


4
\ d không chỉ liệt kê các bảng:\d[S+] list tables, views, and sequences
Jack Douglas

3
Đối với tôi, đây là câu trả lời "đúng" bởi vì nó không yêu cầu bạn phải kết nối với cơ sở dữ liệu hiện có.
aardvarkk

71

\lcũng là viết tắt cho \list. Có khá nhiều lệnh gạch chéo, mà bạn có thể liệt kê trong psql bằng cách sử dụng \?.


35

Để có thêm thông tin về cơ sở dữ liệu và danh sách bảng, bạn có thể làm:

\l+ liệt kê cơ sở dữ liệu

                                                                    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+ để liệt kê tất cả các bảng trong lược đồ search_path hiện tại trong cơ sở dữ liệu hiện tại.

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

Từ pg_Admin, bạn có thể chỉ cần chạy như sau trên cơ sở dữ liệu hiện tại của mình và nó sẽ nhận được tất cả các bảng cho lược đồ đã chỉ định:

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

Điều này sẽ giúp bạn có một danh sách tất cả các bảng cố định (nói chung là các bảng bạn đang tìm kiếm). Bạn chỉ có thể nhận được tên bảng nếu bạn thay đổi *ký tự đại diện thành chỉ table_name. Công chúng table_schemalà lược đồ mặc định cho hầu hết các cơ sở dữ liệu trừ khi quản trị viên của bạn đã thiết lập một lược đồ mới.


3
Mặc dù điều này là đúng, nhưng điều này giải quyết một khách hàng khác với OP đã hỏi.
dezso

Điều này rất tốt cho tôi và mặc dù trường hợp sử dụng của tôi không chính xác như những gì OP yêu cầu, nhưng nó đã giúp tôi có được danh sách bảng trong khi được kết nối qua trình bao bọc (trong Julialang LibPQ.jl )
Vass

19

Có thể là bạn đã chèn các bảng vào một lược đồ không có trong đường dẫn tìm kiếm của bạn hoặc mặc định, tức là công khai và do đó các bảng sẽ không hiển thị khi sử dụng \ dt. Nếu bạn sử dụng một lược đồ được gọi là dữ liệu, bạn có thể sửa lỗi này bằng cách chạy,

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

Thoát và nhập lại psql và bây giờ \ dt cũng sẽ hiển thị cho bạn các bảng trong dữ liệu lược đồ.


1
Chà, một điều đơn giản set search_path=data, public;cũng sẽ tạo nên mánh khóe :)
dezso

@dezso, điều đó có làm thay đổi vĩnh viễn không, hay chỉ trong phiên psql đó?
John Powell

Err, tôi đã không rõ ràng. Nó được dự định thay vì chu kỳ đăng xuất-đăng nhập.
dezso
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.