Postgresql как посмотреть таблицы
Перейти к содержимому

Postgresql как посмотреть таблицы

  • автор:

PostgreSQL | Как проверить существование таблицы в базе данных?

Иногда нужно проверять существование таблицы в базе данных PostgreSQL. В случае её наличия мы делаем одни действия, а в случае её отсутствия — другие. Приложение может упасть в ОШИБКУ, если мы будем пытаться обращаться к данным таблицы, которой нет. Мы же не хотим, чтобы всё у нас отвалилось. Поэтому нам нужны дополнительные проверки и подстраховки на предмет существования таблиц в базе данных.

Однажды может случиться так, что при переезде табличных пространств на новые носители, часть таблиц «уедет» по другому адресу, а приложение(не СУБД) и знать не будет, что их нет. Но от СУБД подобные вещи не скроешь.

Способ № 1 — Через имена таблиц и их схем из pg_tables

Представление pg_tables даёт доступ к полезной информации обо всех таблицах в базе данных.

Столбцы из таблицы pg_tables в PostgreSQL дают имена таблиц и их схем

Команда для вызова представления со списком названий схем и таблиц:

SELECT * FROM pg_tables;

Данная команда выведет все возможные имена таблиц, схем и их владельцев в ТЕКУЩЕЙ базе данных.

Фрагмент из таблицы pg_tables в PostgreSQL с именами схем и таблиц

С этого момент мы точно можем проверить существование таблицы в базе данных если будем использовать SELECT с подзапросом:

SELECT EXISTS (SELECT * FROM pg_tables WHERE tablename = 't_d' AND schemaname = 'a');

Результат выполнения в pgAdmin4

Проверили существование таблицы в базе данных PostgreSQL по имени таблицы и по имени схемы данных

Данная команда вернула TRUE. Значит такая таблица есть в текущей базе данных, а значит можно использовать это в условиях IF в ФУНКЦИЯХ.

Если мы попробуем ввести несуществующую таблицу:

SELECT EXISTS (SELECT * FROM pg_tables WHERE tablename = 't_d_bla_bla_bla' AND schemaname = 'bbbb');

то получим в ответ FALSE

Проверили отсутствие таблицы в базе данных PostgreSQL по имени таблицы и по имени схемы данных

Минусы этого способа в том, что если в в какой-то схеме вашей базы данных лежит 1 миллион таблиц, то вы будете очень долго искать её имя в таблице pg_tables, чтобы понять существует она или нет.

Способ № 2 — Можно напрямую пытаться обратиться к таблице и перехватывать ошибку, если такой таблицы нет

В этом варианте мы точно не знаем существует таблица или нет. Вместо этого мы делаем прямое обращение к нужной нам таблицы из схемы. Если нам повезёт и таблица существует, то мы получим заветное TRUE. А если таблицы нет в БД, то мы упадём в ошибку, которую и перехватим. Сам объект ошибки нам не интересен, мы его используем просто как маркер, что такой таблицы нет и получим FALSE.

Способ № 3 — Через имена типов данных из pg_type

На стороне СУБД PostgreSQL есть дополнительный инструмент, для отлова подобных ситуаций:

По своей сути это таблица, которая хранит все возможные типы данных из БД.

Сейчас ты наверное задаёшься вопросом: «Причём тут типы данных и названия таблиц?«. Открою для тебя один секрет. Под капотом PostgreSQL создаёт ДЛЯ КАЖДОЙ ТАБЛИЦЫ свой собственный ТИП ДАННЫХ и хранит их все с системном каталоге pg_type вперемешку со стандартными. Это нужно для того, чтобы иметь возможность корректно работать с СОСТАВНЫМИ ТИПАМИ ДАННЫХ и переливать их в МАССИВЫ или использовать в ТАБЛИЧНЫХ ФУНКЦИЯХ без проблемного типа record, который не даёт возможность обращаться к атрибутам СОСТАВНОГО ТИПА, чтобы выдёргивать нужные значения.

Как получить все типы данных из текущей базы данных?

SELECT * FROM pg_type;

Внимание! Таблица может оказаться очень большой. В неё также залетают TOAST.

Можно заранее сократить таблицу для поиска нужного нам имени таблицы:

SELECT EXISTS (SELECT typname FROM pg_type WHERE typname = 't_d'); -- true SELECT EXISTS (SELECT typname FROM pg_type WHERE typname = 't_d_1'); -- false

Как просматривать базы данных и таблицы PostgreSQL с помощью psql

Как просматривать базы данных и таблицы PostgreSQL с помощью psql

При администрировании серверов баз данных PostgreSQL одной из наиболее распространенных задач, которые, вероятно, будут выполняться, является перечисление баз данных и их таблиц.

PostgreSQL поставляется с интерактивным инструментом под названием psql, который позволяет вам подключаться к серверу и запрашивать его. При использовании psql вы также можете использовать его метакоманды. Эти команды полезны для сценариев и администрирования командной строки. Все метакоманды начинаются с обратной косой черты без кавычек, \ также известны как команды обратной косой черты.

В этом руководстве объясняется, как отображать базы данных и таблицы на сервере PostgreSQL с помощью psql.

Предпосылки

Чтобы следовать этому руководству, вам понадобятся:

  • PostgreSQL корректно установлен на вашем сервере/рабочем столе. Приведенные ниже команды должны работать в большинстве дистрибутивов Linux. Чтобы установить PostgreSQL на Ubuntu 18.04, прочитайте это руководство. Чтобы установить PostgreSQL на Debian 10, прочтите это руководство.

Список баз данных

Вы можете подключиться к серверу PostgreSQL с помощью команды psql от имени любого пользователя в системе. В зависимости от конфигурации сервера пользователю может потребоваться ввести пароль для подключения к терминалу psql. Чтобы войти в терминал psql как текущий пользователь, просто введите psql.

Когда пакет PostgreSQL установлен, создается пользователь-администратор с именем « postgres ». По умолчанию этот пользователь может подключаться к локальному серверу PostgreSQL без пароля.

Чтобы войти в терминал psql как пользователь » postgres «, запустите:

sudo -u postgres psql

В терминале psql запустите метакоманду \l или \list, чтобы получить список всех баз данных:

Вывод будет включать номер базы данных, имя каждой базы данных, ее владельца, кодировку и права доступа:

 List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+----------+-------------+-------------+----------------------- 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 (3 rows) 

Сервер PostgreSQL имеет три базы данных, созданные по умолчанию: template0, template1 и postgres. Первые два — это шаблоны, которые используются при создании новых баз данных.

Если вы хотите получить больше информации о базе данных, такой как размеры и описания, используйте одну из этих двух команд \ l + или \ list +. Размер базы данных будет отображаться только в том случае, если текущий пользователь может к ней подключиться.

Другой способ перечислить базы данных — использовать следующую инструкцию SQL:

SELECT datname FROM pg_database;

В отличие от метакоманды \l, приведенная выше команда запрашивает только имена баз данных:

 datname ----------- postgres odoo template1 template0 (4 rows)

Чтобы получить список всех баз данных без доступа к оболочке psql, используйте параметр -c, как показано ниже (если вы уже вошли в оболочку psql, введите exit ):

sudo -u postgres psql -c "\l"

Список таблиц базы данных

Чтобы просмотреть все таблицы конкретной базы данных, вам нужно подключиться к ней с помощью метакоманды \c или \connect. Пользователь, вошедший в терминал psql, должен иметь возможность подключения к базе данных.

Повторно подключитесь к оболочке psql, если вы больше не вошли в систему:

sudo -u postgres psql

Чтобы подключиться к базе данных с именем « template1 », введите:

\c template1

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

Если база данных пуста, вывод будет выглядеть так:

No relations found.

Чтобы получить информацию о размерах таблиц и описаниях использования, используйте метакоманду \dt+.

Вывод

Мы увидели, как составить список баз данных и таблиц PostgreSQL с помощью команды psql.

Supportaci se ti piacciono i nostri contenuti. Grazie.

Noviello.it Newsletter

Ricevi gli ultimi approfondimenti direttamente nella tua casella di posta!

15 полезных команд PostgreSQL

В сети много руководств по PostgreSQL, которые описывают основные команды. Но при погружении в работу возникают такие практические вопросы, для которых требуются продвинутые команды. Рассмотрим несколько таких команд на примерах, полезных как для разработчиков, так и для администраторов баз данных.

Обложка поста 15 полезных команд PostgreSQL

В сети много руководств по PostgreSQL, которые описывают основные команды. Но при погружении глубже в работу возникают такие практические вопросы, для которых требуются продвинутые команды.

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

Получение информации о базе данных

Размер базы данных

Чтобы получить физический размер файлов (хранилища) базы данных, используем следующий запрос:

SELECT pg_database_size(current_database()); 

Результат будет представлен как число вида 41809016 .

current_database() — функция, которая возвращает имя текущей базы данных. Вместо неё можно ввести имя текстом:

SELECT pg_database_size('my_database'); 

Для того, чтобы получить информацию в человекочитаемом виде, используем функцию pg_size_pretty :

SELECT pg_size_pretty(pg_database_size(current_database())); 

В результате получим информацию вида 40 Mb .

Перечень таблиц

Иногда требуется получить перечень таблиц базы данных. Для этого используем следующий запрос:

SELECT table_name FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','pg_catalog'); 

information_schema — стандартная схема базы данных, которая содержит коллекции представлений (views), таких как таблицы, поля и т.д. Представления таблиц содержат информацию обо всех таблицах баз данных.

Запрос, описанный ниже, выберет все таблицы из указанной схемы текущей базы данных:

SELECT table_name FROM information_schema.tables WHERE table_schema NOT IN ('information_schema', 'pg_catalog') AND table_schema IN('public', 'myschema'); 

В последнем условии IN можно указать имя определенной схемы.

Размер таблицы

По аналогии с получением размера базы данных размер данных таблицы можно вычислить с помощью соответствующей функции:

SELECT pg_relation_size('accounts'); 

Функция pg_relation_size возвращает объём, который занимает на диске указанный слой заданной таблицы или индекса.

Имя самой большой таблицы

Для того, чтобы вывести список таблиц текущей базы данных, отсортированный по размеру таблицы, выполним следующий запрос:

SELECT relname, relpages FROM pg_class ORDER BY relpages DESC; 

Для того, чтобы вывести информацию о самой большой таблице, ограничим запрос с помощью LIMIT :

SELECT relname, relpages FROM pg_class ORDER BY relpages DESC LIMIT 1; 

relname — имя таблицы, индекса, представления и т.п.
relpages — размер представления этой таблицы на диске в количествах страниц (по умолчанию одна страницы равна 8 Кб).
pg_class — системная таблица, которая содержит информацию о связях таблиц базы данных.

Перечень подключенных пользователей

Чтобы узнать имя, IP и используемый порт подключенных пользователей, выполним следующий запрос:

SELECT datname,usename,client_addr,client_port FROM pg_stat_activity; 

Активность пользователя

Чтобы узнать активность соединения конкретного пользователя, используем следующий запрос:

SELECT datname FROM pg_stat_activity WHERE usename = 'devuser'; 

Работа с данными и полями таблиц

Удаление одинаковых строк

Если так получилось, что в таблице нет первичного ключа (primary key), то наверняка среди записей найдутся дубликаты. Если для такой таблицы, особенно большого размера, необходимо поставить ограничения (constraint) для проверки целостности, то удалим следующие элементы:

  • дублирующиеся строки,
  • ситуации, когда одна или более колонок дублируются (если эти колонки предполагается использовать в качестве первичного ключа).

Рассмотрим таблицу с данными покупателей, где задублирована целая строка (вторая по счёту).

15 полезных команд PostgreSQL 1

Удалить все дубликаты поможет следующий запрос:

DELETE FROM customers WHERE ctid NOT IN (SELECT max(ctid) FROM customers GROUP BY customers.*); 

Уникальное для каждой записи поле ctid по умолчанию скрыто, но оно есть в каждой таблице.

Последний запрос требователен к ресурсам, поэтому будьте аккуратны при его выполнении на рабочем проекте.

Теперь рассмотрим случай, когда повторяются значения полей.

15 полезных команд PostgreSQL 2

Если допустимо удаление дубликатов без сохранения всех данных, выполним такой запрос:

DELETE FROM customers WHERE ctid NOT IN (SELECT max(ctid) FROM customers GROUP BY customer_id); 

Если данные важны, то сначала нужно найти записи с дубликатами:

SELECT * FROM customers WHERE ctid NOT IN (SELECT max(ctid) FROM customers GROUP BY customer_id); 

15 полезных команд PostgreSQL 3

Перед удалением такие записи можно перенести во временную таблицу или заменить в них значение customer_id на другое.

Общая форма запроса на удаление описанных выше записей выглядит следующим образом:

DELETE FROM table_name WHERE ctid NOT IN (SELECT max(ctid) FROM table_name GROUP BY column1, [column 2,] ); 

Безопасное изменение типа поля

Может возникнуть вопрос о включении в этот список такой задачи. Ведь в PostgreSQL изменить тип поля очень просто с помощью команды ALTER . Давайте для примера снова рассмотрим таблицу с покупателями.

Для поля customer_id используется строковый тип данных varchar . Это ошибка, так как в этом поле предполагается хранить идентификаторы покупателей, которые имеют целочисленный формат integer . Использование varchar неоправданно. Попробуем исправить это недоразумение с помощью команды ALTER :

ALTER TABLE customers ALTER COLUMN customer_id TYPE integer; 

Но в результате выполнения получим ошибку:

Это значит, что нельзя просто так взять и изменить тип поля при наличии данных в таблице. Так как использовался тип varchar , СУБД не может определить принадлежность значения к integer . Хотя данные соответствуют именно этому типу. Для того, чтобы уточнить этот момент, в сообщении об ошибке предлагается использовать выражение USING , чтобы корректно преобразовать наши данные в integer :

ALTER TABLE customers ALTER COLUMN customer_id TYPE integer USING (customer_id::integer); 

В результате всё прошло без ошибок:

15 полезных команд PostgreSQL 4

Обратите внимание, что при использовании USING кроме конкретного выражения возможно использование функций, других полей и операторов.

Например, преобразуем поле customer_id обратно в varchar , но с преобразованием формата данных:

ALTER TABLE customers ALTER COLUMN customer_id TYPE varchar USING (customer_id || '-' || first_name); 

В результате таблица примет следующий вид:

15 полезных команд PostgreSQL 5

Поиск «потерянных» значений

Будьте внимательны при использовании последовательностей (sequence) в качестве первичного ключа (primary key): при назначении некоторые элементы последовательности случайно пропускаются, в результате работы с таблицей некоторые записи удаляются. Такие значения можно использовать снова, но найти их в больших таблицах сложно.

15 полезных команд PostgreSQL 6

Рассмотрим два варианта поиска.

Первый способ
Выполним следующий запрос, чтобы найти начало интервала с «потерянным» значением:

SELECT customer_id + 1 FROM customers mo WHERE NOT EXISTS ( SELECT NULL FROM customers mi WHERE mi.customer_id = mo.customer_id + 1 ) ORDER BY customer_id; 

В результате получим значения: 5 , 9 и 11 .

Если нужно найти не только первое вхождение, а все пропущенные значения, используем следующий (ресурсоёмкий!) запрос:

WITH seq_max AS ( SELECT max(customer_id) FROM customers ), seq_min AS ( SELECT min(customer_id) FROM customers ) SELECT * FROM generate_series((SELECT min FROM seq_min),(SELECT max FROM seq_max)) EXCEPT SELECT customer_id FROM customers; 

В результате видим следующий результат: 5 , 9 и 6 .

Второй способ
Получаем имя последовательности, связанной с customer_id :

SELECT pg_get_serial_sequence('customers', 'customer_id'); 

И находим все пропущенные идентификаторы:

WITH sequence_info AS ( SELECT start_value, last_value FROM "SchemaName"."SequenceName" ) SELECT generate_series ((sequence_info.start_value), (sequence_info.last_value)) FROM sequence_info EXCEPT SELECT customer_id FROM customers; 

Подсчёт количества строк в таблице

Количество строк вычисляется стандартной функцией count , но её можно использовать с дополнительными условиями.

Общее количество строк в таблице:

SELECT count(*) FROM table; 

Количество строк при условии, что указанное поле не содержит NULL :

SELECT count(col_name) FROM table; 

Количество уникальных строк по указанному полю:

SELECT count(distinct col_name) FROM table; 

Использование транзакций

Транзакция объединяет последовательность действий в одну операцию. Её особенность в том, что при ошибке в выполнении транзакции ни один из результатов действий не сохранится в базе данных.

Начнём транзакцию с помощью команды BEGIN .

Для того, чтобы откатить все операции, расположенные после BEGIN , используем команду ROLLBACK .

А чтобы применить — команду COMMIT .

Просмотр и завершение исполняемых запросов

Для того, чтобы получить информацию о запросах, выполним следующую команду:

SELECT pid, age(query_start, clock_timestamp()), usename, query FROM pg_stat_activity WHERE query != '' AND query NOT ILIKE '%pg_stat_activity%' ORDER BY query_start desc; 

Для того, чтобы остановить конкретный запрос, выполним следующую команду, с указанием id процесса (pid):

SELECT pg_cancel_backend(procpid); 

Для того, чтобы прекратить работу запроса, выполним:

SELECT pg_terminate_backend(procpid); 

Работа с конфигурацией

Поиск и изменение расположения экземпляра кластера

Возможна ситуация, когда на одной операционной системе настроено несколько экземпляров PostgreSQL, которые «сидят» на различных портах. В этом случае поиск пути к физическому размещению каждого экземпляра — достаточно нервная задача. Для того, чтобы получить эту информацию, выполним следующий запрос для любой базы данных интересующего кластера:

SHOW data_directory; 

Изменим расположение на другое с помощью команды:

SET data_directory to new_directory_path; 

Но для того, чтобы изменения вступили в силу, требуется перезагрузка.

Получение перечня доступных типов данных

Получим перечень доступных типов данных с помощью команды:

SELECT typname, typlen from pg_type where typtype='b'; 

typname — имя типа данных.
typlen — размер типа данных.

Изменение настроек СУБД без перезагрузки

Настройки PostgreSQL находятся в специальных файлах вроде postgresql.conf и pg_hba.conf . После изменения этих файлов нужно, чтобы СУБД снова получила настройки. Для этого производится перезагрузка сервера баз данных. Понятно, что приходится это делать, но на продакшн-версии проекта, которым пользуются тысячи пользователей, это очень нежелательно. Поэтому в PostgreSQL есть функция, с помощью которой можно применить изменения без перезагрузки сервера:

SELECT pg_reload_conf(); 

Но, к сожалению, она применима не ко всем параметрам. В некоторых случаях для применения настроек перезагрузка обязательна.

На данный момент этот блок не поддерживается, но мы не забыли о нём! Наша команда уже занята его разработкой, он будет доступен в ближайшее время.

Мы рассмотрели команды, которые помогут упростить работу разработчикам и администраторам баз данных, использующим PostgreSQL. Но это далеко не все возможные приёмы. Если вы сталкивались с интересными задачами, напишите о них в комментариях. Поделимся полезным опытом!

Следите за новыми постами по любимым темам

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

Postgresql как посмотреть таблицы

Запись: and-semakin/mytetra_data/master/base/1549120746k8hxjaavxv/text.html на raw.githubusercontent.com

В определенной схеме:

SELECT * FROM information_schema.tables

WHERE table_schema = ‘public’

  • Вывод диаграмы БД в PostgreSQL
  • Размер БД или таблицы в PostgreSQL
  • Временно отключить триггеры в PostgreSQL
  • Установить схему по умолчанию в PostgreSQL
  • Конвертировать integer в boolean в PostgreSQL
  • Создать материализованное представление в PostgreSQL
  • Создать временную таблицу в PostgreSQL
  • Обновить или создать (upsert) строку в PostgreSQL
  • Просмотреть определение представления (view definition) в PostgreSQL
  • Показать список БД и выбрать БД в psql
  • Удалить БД в PostgreSQL
  • Переименовать БД в PostgreSQL
  • Показать выполняющиеся запросы PostgreSQL
  • psql — сохранить пароль для подключения к серверу PostgreSQL
  • Задержка/пауза (pg_sleep) в PostgreSQL
  • Получить список индексов на таблице в PostgreSQL
  • Показать количество строк во всех таблицах в БД в PostgreSQL
  • Инвертировать булевое значение в PostgreSQL
  • Сменить пейджер в pgcli
  • Сайт для работы с планами запросов в PostgreSQL
  • Убить зависший запрос в PostgreSQL
  • Настроить ограничения для планировщика запросов в PostgreSQL
  • Сгенерировать последовательность в PostgreSQL
  • Получить количество клиентов, подключенных к БД, в PostgreSQL
  • Показать список таблиц в БД в PostgreSQL
  • Отключить всех клиентов от БД в PostgreSQL
  • Вывод в файл в psql
  • Обновить значение в jsonb в PostgreSQL
  • Узнать расположение файла конфигурации в PostgreSQL
  • Получить размер поля в PostgreSQL
  • Отсортировать строки в случайном порядке в PostgreSQL
  • Выгрузить результат запроса в файл в PostgreSQL
  • Показать установленные и доступные расширения в PostgreSQL
  • Запретить подключение к БД в PostgreSQL
  • Статистика медленных запросов через pg_stat_statements в PostgreSQL
  • Создать базу данных, если она ещё не создана, в PostgreSQL
  • Вставить несколько записей одним запросов в PostgreSQL
  • Удалить столбец из таблицы в PostgreSQL
  • Узнать, какие запросы блокируют друг друга в PostgreSQL
  • Оконная функция row_number для нумерации строк в выводе в PostgreSQL
  • Оконные функции для ранжирования строк в выводе в PostgreSQL
  • Подключиться к PostgreSQL серверу через DSN (строку подключения) через psql
  • Убедиться, что при подключении к PostgreSQL было использовано шифрование (SSL/TLS)
  • Создать UUID в PostgreSQL
  • Вставить данные, полученные из SELECT-запроса в PostgreSQL
  • Получить список незавершенных (зависших) транзакций в PostgreSQL
  • Создать функцию, которая ничего не возвращает, в PostgreSQL
  • Перенести данные из одной таблицы в другую в PostgreSQL
  • Арифметические операции над датами в PostgreSQL
  • Выбрать таблицу (несколько строк), заполненную константными значениями в PostgreSQL

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *