Как мне перечислить все базы данных и таблицы, используя psql?


1171

Я пытаюсь изучить администрирование PostgreSQL и начал изучать, как использовать psqlинструмент командной строки.

Когда я вхожу в систему psql --username=postgres, как мне перечислить все базы данных и таблицы?

Я попробовал \d, dи , dS+но ничего не перечислено. Я создал две базы данных и несколько таблиц с помощью pgAdmin III, поэтому я знаю, что они должны быть перечислены.


1
Если вы хотите получить к нему доступ через командную строку, запуститеpsql -l
adriaan

Этот комментарий, безусловно, должен быть одним из лучших ответов! Если вам нужна авторизация, вы также можете psql --username=postgres -l.
Ulysse BN

Ответы:


1544

Обратите внимание на следующие команды:

  • \listили \l: список всех баз данных
  • \dt: список всех таблиц в текущей базе данных

Вы никогда не увидите таблицы в других базах данных, эти таблицы не видны. Вы должны подключиться к правильной базе данных, чтобы увидеть ее таблицы (и другие объекты).

Для переключения баз данных:

\connect database_name или же \c database_name

Смотрите руководство о PSQL .


131
Вы можете использовать \c db_nameдля подключения к определенной базе данных.
eikes

17
\dtне отображает список всех таблиц в текущей базе данных (кажется, исключая те, которые не найдены search_pathпо крайней мере в 9.2)
Джек Дуглас

22
\dt *.перечислит все таблицы во всех схемах, без необходимости изменять ваш путь поиска.
Данпелота

19
\ l + мой любимый - он также показывает использование диска.
Лестер Чунг

1
В Windows я могу перечислить базы данных с помощью этой команды, psql -U username -lно она не работает с косой версией.
NoNameProvided

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. \ dt намного проще, чем вводить любой запрос.
Фрэнк Хайкенс

19
Я думаю, что это ОТЛИЧНЫЙ ответ, потому что он может быть выполнен из командной строки Linux, в отличие от необходимости быть в интерпретаторе psql, который иногда зависает для меня при использовании ExtraPutty.
Любовь и мир - Джо Кодсвелл

2
Также спас мой день. Для моего конкретного случая я добавляю, WHERE table_schema = 'public'потому что хочу удалить только пользовательские таблицы.
Ренра

29
Если вы запустите psql с флагом -E, он отобразит реальный запрос при использовании мета-команды.
Дибстер

Это хороший ответ. Хотя ОП хотел метакоманды, я гуглил это, и это привело меня к этому вопросу.
счет

110

В 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и нажмите ввод. Или Ctrl-Dделает то же самое. Это таблицы в этой базе данных.


4
\ d не просто перечисляет таблицы:\d[S+] list tables, views, and sequences
Джек Дуглас

3
Для меня это «правильный» ответ, потому что он не требует, чтобы вы уже были подключены к существующей базе данных.
aardvarkk

71

\lэто также сокращение для \list. Существует довольно много команд слеша, которые вы можете перечислить в psql, используя \?.


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_name. Общедоступная table_schemaявляется схемой по умолчанию для большинства баз данных, если только администратор не установил новую схему.


3
Хотя это правда, это относится к другому клиенту, о котором не спрашивал OP.
Дезсо

Это отлично сработало для меня, и, хотя мой вариант использования не был тем, о чем просил OP, он помог мне получить список таблиц при подключении через обертку (в Julialang LibPQ.jl )
Vass

19

Возможно, вы вставили таблицы в схему, которой нет в пути поиска, или по умолчанию, то есть в public, и поэтому таблицы не будут отображаться с помощью \ dt. Если вы используете схему, скажем, data, вы можете исправить это, запустив

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

Выйдите и снова введите psql, и теперь \ dt также покажет вам таблицы в данных схемы.


1
Ну, простое set search_path=data, public;тоже бы
сработало

@dezso, это вносит изменения навсегда или только в этот сеанс psql?
Джон Пауэлл

Эээ, мне было не очень понятно. Он был предназначен вместо цикла logout-login.
Dezso
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.