列出所有表

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

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

这是我所有数据库的清单:

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=#
251471 次浏览

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

\c liferay
\dt

反正我就是这么做的。

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

\c liferay \dt

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

\dt *.*

以指示希望所有表 在所有模式中。这将包括 pg_catalog中的表、系统表和 information_schema中的表。没有内置的方法来表示“所有用户定义模式中的所有表”; 但是,您可以在运行 \dt之前将 search_path设置为所有感兴趣的模式的列表。

您可能希望以编程方式执行此操作,在这种情况下,psql反斜杠命令不会执行此操作。这就是 INFORMATION_SCHEMA来救援的地方。列表:

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

顺便说一句,如果你想知道 psql对反斜杠命令的反应是什么,用 -E标志运行 psql。例如:

$ 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可以作为如何查询的有用指南。

查看您可以执行的公共表

列表

\dt

列表表、视图和访问权限

\dp or \z

或者只是表名

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

在 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

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

  for table in $(psql -qAntc '\dt' | cut -d\| -f2); do
...
done

一个单行的例子是:

\dt schemaname.*

在你的场景中:

\dt public.*

为了获得模式列表:

\dn

请注意,当没有指定任何模式时,public是默认模式:

在前面的部分中,我们创建表时没有指定任何 默认情况下,这些表(和其他对象)是 自动放入一个名为“公共”的模式。每个新的数据库 包含这样的模式。

使用 \dt *.*将输出所有模式中所有表的长列表,包括诸如 pg_catalog之类的内部表。以上内容有助于过滤。