Ответ 1
Если вы хотите перечислить все таблицы, вы должны использовать:
\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
может быть полезным руководством для этого.