Показать структуру таблицы и список таблиц в PostgreSQL

Я использовал MySQL для нескольких предыдущих проектов. Но теперь решил перейти на PostgreSQL. Не то, что версия 8 также работает над этим, а также другие ОС, которые я застрял на работе.

Но, увы, две из самых полезных команд, кажется, отсутствуют:

  • SHOW TABLES
  • DESCRIBE table

Поскольку моя прототипирующая БД находится на моем сервере NetBSD дома, в то время как моя данные, ожидающие быть на основе, работают, так что я должен подключиться через Perl/DBI и XML-RPC (не psql, увы). ИТ-отдел здесь просто говорит: "Используйте MS-Access ", поэтому не помогайте там.

Пока я нахожусь на начальной стадии, мне нужен информативный способ промахнуться вокруг и посмотреть, что, как я пытаюсь разными способами построить эту вещь. Для этого я всегда полагался на два выше из MySQL.

Я не могу поверить, что PostgreSQL не может сказать мне, что текущая структура таблицы БД осуществляется через простые SQL-запросы, выполненные удаленно.

Конечно, должно быть. Но я не могу понять, что книги, которые у меня есть. Все, что я раскопал, было некоторым ультра-хромым взломом, чтобы получить имена столбцов для уже известного имени таблицы, сделав "WHERE 1!= 1" или некоторые такие так что никакие фактические строки не могут быть возвращены. Не очень информативно, что. Наверняка я пропустил точку, где-то.

Так просветите меня, пожалуйста. Что, скажите, это PostgreSQL-ish SQL запросы, которые используются для изучения данной структуры таблицы БД? Что перевод PostgreSQL для "SHOW TABLES" и "DESCRIBE table"?

Ответ 1

Согласно документации

SELECT
    table_schema || '.' || table_name as show_tables
FROM
    information_schema.tables
WHERE
    table_type = 'BASE TABLE'
AND
    table_schema NOT IN ('pg_catalog', 'information_schema');

для большего удобства сделайте это как функцию

create or replace function show_tables() returns SETOF text as $$
SELECT
    table_schema || '.' || table_name as show_tables
FROM
    information_schema.tables
WHERE
    table_type = 'BASE TABLE'
AND
    table_schema NOT IN ('pg_catalog', 'information_schema');
$$
language sql; 

Таким образом, мы можем получить таблицы, используя

select show_tables()

Для описания таблицы

 select column_name, data_type, character_maximum_length
 from INFORMATION_SCHEMA.COLUMNS where table_name ='table_name';

как функция

create or replace function describe_table(tbl_name text) returns table(column_name   
varchar, data_type varchar,character_maximum_length int) as $$
select column_name, data_type, character_maximum_length
from INFORMATION_SCHEMA.COLUMNS where table_name = $1;
$$
language 'sql';

select  *  from describe_table('a_table_name');

Ответ 2

SHOW TABLES и DESCRIBE TABLE являются специфичными для MySQL командами администратора и не имеют ничего общего со стандартным SQL.

Вы хотите:

\d

а также

\d+ tablename

команды от psql.

Они реализованы на стороне клиента. Я нахожу это странным и хотел бы переместить их на стороне сервера в качестве встроенных команд SQL однажды.

Другие клиенты предоставляют другие способы просмотра структуры - например, PgAdmin-III.

Если вам нужен переносимый способ получить структуру таблицы в коде, вы должны использовать представления information_schema, которые являются стандартом SQL. Смотрите information_schema. Они доступны в MySQL, PostgreSQL, Ms-SQL и большинстве других БД. Недостатком является то, что они более удобны в использовании, поэтому они не удобны для быстрого доступа, когда вы просто просматриваете структуру БД.