135

我想liferay在我的 PostgreSQL 安装中列出数据库中的所有表。我怎么做?

我想SELECT * FROM applications;liferay数据库中执行。applications是我的 liferay 数据库中的一张表。这是怎么做到的?

这是我所有数据库的列表:

postgres=# \list
                              List of databases
Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
 -----------+----------+----------+-------------+-------------+-----------------------
 liferay   | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | =Tc/postgres         +
           |          |          |             |             | postgres=CTc/postgres+
           |          |          |             |             | liferay=CTc/postgres
 lportal   | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | 
 postgres  | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | 
 template0 | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_GB.UTF-8 | en_GB.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(5 rows)

postgres=# 
4

6 回答 6

221

如果要列出所有表,则必须使用:

\dt *.*

表示您想要所有模式中的所有表。这将包括 中pg_catalog的表、系统表和information_schema. 没有内置方式可以说“所有用户定义模式中的所有表”;但是,您可以search_path在运行\dt.

您可能希望以编程方式执行此操作,在这种情况下,psql反斜杠命令将无法完成这项工作。INFORMATION_SCHEMA就是救援的地方。列出表格:

SELECT table_name FROM information_schema.tables WHERE table_schema = 'public';

顺便说一句,如果您想查看psql响应反斜杠命令的操作,请psql使用该-E标志运行。例如:

$ psql -E regress    
regress=# \list
********* QUERY **********
SELECT d.datname as "Name",
       pg_catalog.pg_get_userbyid(d.datdba) as "Owner",
       pg_catalog.pg_encoding_to_char(d.encoding) as "Encoding",
       d.datcollate as "Collate",
       d.datctype as "Ctype",
       pg_catalog.array_to_string(d.datacl, E'\n') AS "Access privileges"
FROM pg_catalog.pg_database d
ORDER BY 1;
**************************

所以你可以看到它在获取数据库列表时psql正在搜索。pg_catalog.pg_database同样,对于给定数据库中的表:

SELECT n.nspname as "Schema",
  c.relname as "Name",
  CASE c.relkind WHEN 'r' THEN 'table' WHEN 'v' THEN 'view' WHEN 'i' THEN 'index' WHEN 'S' THEN 'sequence' WHEN 's' THEN 'special' WHEN 'f' THEN 'foreign table' END as "Type",
  pg_catalog.pg_get_userbyid(c.relowner) as "Owner"
FROM pg_catalog.pg_class c
     LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r','')
      AND n.nspname <> 'pg_catalog'
      AND n.nspname <> 'information_schema'
      AND n.nspname !~ '^pg_toast'
  AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 1,2;

在可能的情况下,最好使用可移植的 SQL 标准INFORMATION_SCHEMA而不是 Pg 系统目录,但有时您需要 Pg 特定的信息。在这些情况下,可以直接查询系统目录,并且psql -E可以作为如何查询的有用指南。

于 2012-09-17T08:13:02.027 回答
94

连接到数据库,然后列出表:

\c liferay
\dt

反正我就是这样做的。

如果您愿意,可以将这两个命令合并到一行中:

\c liferay \dt
于 2012-09-16T09:03:55.420 回答
11

要查看公共表,您可以执行

列表表

\dt

列出表、查看和访问权限

\dp or \z

或者只是表名

select table_name from information_schema.tables where table_schema = 'public';
于 2016-07-19T05:09:08.703 回答
3

在 SQL Query 中,您可以编写以下代码:

select table_name from information_schema.tables where table_schema='YOUR_TABLE_SCHEME';

用 YOUR_TABLE_SCHEME 替换您的表方案;

例子:

select table_name from information_schema.tables where table_schema='eLearningProject';

要查看所有方案和所有表,不需要 where 子句:

select table_name from information_schema.tables
于 2016-08-26T13:43:56.010 回答
2

一个单行示例是:

\dt schemaname.* 

在您的场景中:

\dt public.*

并获取模式列表:

\dn

请注意,这public是未指定时的默认架构。引用文档

在前面的部分中,我们创建了表而不指定任何模式名称。默认情况下,此类表(和其他对象)会自动放入名为“public”的模式中。每个新数据库都包含这样的模式。

使用\dt *.*将输出所有模式中所有表的长列表,包括内部表,例如pg_catalog. 以上可以帮助过滤。

于 2019-12-09T13:26:58.497 回答
1

如果您不需要所有模式中的所有表,这可以在自动化脚本中使用:

  for table in $(psql -qAntc '\dt' | cut -d\| -f2); do
      ...
  done
于 2017-09-20T11:42:25.247 回答