如何使用psql列出所有数据库和表?


1171

我正在尝试学习PostgreSQL管理,并且已经开始学习如何使用psql命令行工具。

使用登录时psql --username=postgres,如何列出所有数据库和表?

我曾尝试\dddS+但没有列出。我已经使用pgAdmin III创建了两个数据库和一些表,所以我知道应该列出它们。


1
如果您想通过命令行访问它,请运行psql -l
adriaan18'Apr 22'18

此评论绝对应该是最佳答案之一!如果您需要身份验证,也可以psql --username=postgres -l
雅典

Answers:


1543

请注意以下命令:

  • \list\l:列出所有数据库
  • \dt:列出当前数据库中的所有表

您将永远不会看到其他数据库中的表,这些表是不可见的。您必须连接到正确的数据库才能查看其表(和其他对象)。

要切换数据库:

\connect database_name 要么 \c database_name

请参阅有关psql的手册。


131
您可以\c db_name用来连接到某个数据库。
eikes

17
\dt似乎未列出当前数据库中的所有表(似乎排除了search_path至少在9.2 中未找到的表)
杰克·道格拉斯

22
\dt *.将列出所有模式中的所有表,而无需修改搜索路径。
danpelota 2015年

19
\ l +是我的最爱-它也显示磁盘使用情况。
张敬轩

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
您是对的,但问题是关于psql-tool的meta命令。\ dt比键入任何查询要容易得多。
Frank Heikens 2011年

19
我认为这是一个很好的答案,因为它可以从Linux命令行执行,而不是需要放在psql解释器中,而后者有时会使用ExtraPutty挂起。
爱与和平-Joe Codeswell,2015年

2
也挽救了我的一天。对于我的特殊情况,我要添加,WHERE table_schema = 'public'因为我只想删除自定义表。
雷拉2015年

29
如果使用-E标志启动psql,则在使用meta命令时它将显示实际查询。
Deebster

这是一个很好的答案。尽管OP希望使用元命令,但我为此进行了搜索,这使我想到了这个问题。
扔掉帐户

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+ 列出当前数据库中当前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中,您可以简单地在当前数据库上运行以下命令,它将获取指定架构的所有表:

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

这将为您提供所有永久表(通常是您要查找的表)的列表。如果将*通配符更改为,则只能获得表名table_nametable_schema除非您的管理员设置了新的架构,否则public 是大多数数据库的默认架构。


3
尽管这是事实,但这与OP请求的目标客户不同。
dezso 2012年

这对我来说非常有用,尽管我的用例并不完全是OP所要求的,但它通过包装器连接时(在Julialang LibPQ.jl中)帮助我获取了表列表
Vass

19

您可能已经将表插入了不在您的搜索路径或默认路径(即公共)中的架构中,因此使用\ dt不会显示这些表。如果您使用称为数据的架构,则可以通过运行,

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

退出并重新输入psql,现在\ dt也会向您显示模式数据中的表。


1
好吧,一个简单的方法set search_path=data, public;也可以解决问题:)
dezso 2014年

@dezso,这是否永久地或仅在该psql会话中进行更改?
约翰·鲍威尔

嗯,我不是很清楚。它旨在代替注销-登录周期。
dezso 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.