PostgreSQL

PostgreSQL: Запрос на получение списка комментариев к колонкам таблицы

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

Организовать это можно через комментарий к полю. Задать его можно через интерфейс pgAdmin, в свойствах поля:

Или прописать в скрипте:

[pastacode lang=»sql» manual=»COMMENT%20ON%20COLUMN%20public.products.product_id%0A%20%20%20%20IS%20’%D0%9A%D0%BE%D0%BC%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%80%D0%B8%D0%B9’%3B» message=»Добавление комментария к колонке» highlight=»» provider=»manual»/]

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

[pastacode lang=»sql» manual=»select%20subq.attname%3A%3Atext%2C%20d.description%0A%09FROM%20%0A%09%09(SELECT%20c.relname%2C%20obj_description(c.oid)%20obj_description%2C%20a.attname%2C%20c.oid%2C%20a.attnum%0A%09%09FROM%20pg_class%20c%2C%20pg_attribute%20a%0A%09%09WHERE%20c.oid%20%3D%20a.attrelid%0A%09%09AND%20c.relname%20in%20(‘products’)%0A%09%09AND%20a.attnum%20%3E%200)%20subq%20%0A%09LEFT%20OUTER%20JOIN%20pg_description%20d%20ON%20(d.objsubid%20%3D%20subq.attnum%20AND%20d.objoid%20%3D%20subq.oid)%0A%09where%20subq.attname%20not%20ilike%20’%25pg.dropped%25’%3B» message=»Имена колонок таблицы products и комментарии к ним» highlight=»6″ provider=»manual»/]

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

 

PostgreSQL, Базы данных

PostgreSQL: Результаты запроса в JSON

Мне бы хотелось рассказать очень кратенько про две часто мною используемые функции — json_agg и row_to_json.

Первая используется для получения результата выполнения SQL запроса как массив объектов JSON. Таким образом, одна запись складывается в один объект массива:

[pastacode lang=»sql» manual=»select%20json_agg(t)%20from%0A(select%20*%20from%20products)%20t» message=»json_agg» highlight=»» provider=»manual»/]

[pastacode lang=»sql» manual=»select%20json_agg(t)%20from%0A(select%20product_id%2C%20min_storage_temp%2C%20max_storage_temp%20%0A%20from%20products%20where%20coalesce(min_storage_temp%2C»)%20%3C%3E%20»)%20t» message=»Получить данные указанных полей» highlight=»json_agg» provider=»manual»/]

Результат такого запроса будет выглядеть похожим образом:

[
{
«product_id»:»aaa5f25c-5734-11ec-8cd2-00155d999336″,
«min_storage_temp»:»-4″,
«max_storage_temp»:»+6″
},
{
«product_id»:»1735acd6-fd3f-4146-8efc-718d7c55faaf»,
«min_storage_temp»:»0″,
«max_storage_temp»:»+6″
},
{
«product_id»:»c89cc4d8-c531-11eb-958d-772a230b0b21″,
«min_storage_temp»:»-4″,
«max_storage_temp»:»+6″
}
]

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

[pastacode lang=»sql» manual=»select%20row_to_json(t)%20FROM%20%0A(select%20*%20from%20products%20where%20product_id%20%3D%20’123′)%20t» message=»row_to_json» highlight=»» provider=»manual»/]

[
{
«product_id»:»c89cc4d8-c531-11eb-958d-772a230b0b21″,
«min_storage_temp»:»-4″,
«max_storage_temp»:»+6″
}
]

PostgreSQL, Qt, Портфолио

DBServerWizard — автоматизация работы с базами данных PostgreSQL

Сегодня хочу познакомить вас с утилитой DBServerWizard, написание которой закончила намедни. Если коротко, ее предназначение — самые базовые элементы управления базами данных PostgreSQL.

МенюУстановка сервераРезервное копирование/ восстановление из копииСоздание базы данных
Меню
Установка сервера
Бэкап/рестор
Создание БД

А если расписать немного подробнее, то перечень такой:

  • Установка сервера PostgreSQL (включает предварительную проверку наличия уже установленного сервера).
  • Создание и удаление баз данных. Есть некоторый обязательный набор баз данных; при подключении к серверу происходит проверка наличия этого минимального набора, если какие-либо БД из этого списка отсутствуют, то предлагается произвести создание БД и восстановление из бэкапа. Доступно принудительное удаление при наличии «застрявших» подключений, мешающих операции.
  • Резервное копирование и восстановление из копии. Перед восстановлением базы данных производится резервное копирование «на всякий случай».
  • Обновление баз данных из скриптов. Скрипт разделяется на отдельные инструкции, которые выполняются последовательно. Невыполненные инструкции записываются в отдельный файл.

Следующие сообщения были написаны в течение работы над утилитой:

Qt: Восстановление pg_restore БД PostgreSQL в Windows

Принудительное удаление базы данных в PostgreSQL

Qt: Резервная копия pg_dump БД PostgreSQL в Windows

Файл паролей PostgreSQL pgpass в Windows

Путь к каталогу bin PostgreSQL Windows

Чтобы заказать проект или получить консультацию, перейдите, пожалуйста, на страницу Контакты.

Моё портфолио

Инфо обо мне

PostgreSQL, Qt

Qt: Восстановление pg_restore БД PostgreSQL в Windows

Здесь: Qt: Резервная копия pg_dump БД PostgreSQL в Windows я показала один из способов организации создания резервной копии базы данных.

Сейчас речь пойдет о восстановлении базы из бэкапа. Здесь тоже будем использовать пакетный файл для вызова pg_restore.

Про каталог bin, файл паролей pgpass написано в статье по ссылке выше.

void myClass::restoreDatabase(QString name, QString file)
{
    QString errorMsg;
    QString connectionName = connectToDB(name, errorMsg);
    if (connectionName.isEmpty()){
        error(errorMsg);
        return;
    }
    QString binDir = postgresBinDirectory();
    if (binDir.isEmpty()) {
        qDebug() << "error";
        QSqlDatabase::removeDatabase(connectionName);
        return;
    }
    QSqlQuery query(QSqlDatabase::database(connectionName));
    if (!query.exec(QString("DROP SCHEMA public cascade;  "
                            "CREATE SCHEMA public "
                            "AUTHORIZATION postgres; "
                            "COMMENT ON SCHEMA public "
                            "IS 'standard public schema'; "
                            "GRANT ALL ON SCHEMA public TO PUBLIC; "
                            "GRANT ALL ON SCHEMA public TO %1;")
                    .arg(postgresUser))) {
        qDebug() << "error";
        QSqlDatabase::removeDatabase(connectionName);
        return;
    }
    QSqlDatabase::removeDatabase(connectionName);
    QString batText = QString("ECHO OFF \n"
                              "SET dmpfile=%1 \n"
                              "set text = Begin to restore...  \n"
                              "echo %text% \n"
                              "cd /d %2 \n"
                              "pg_restore --host=%4 --port=%5 "
                              "--username=%6 --verbose -d "
                              " %3 \"%dmpfile%\"\n"
                              "set /p id=\"The process is finished successfully. "
                              "Press Enter to exit...\"")
            .arg(file, binDir, name,
                 host, ui->port->text(), postgresUser);
    QString fileName = QString("%1-restore.bat")
            .arg(name);
    if (!writeBatFile(batText, fileName, 
					  QCoreApplication::applicationDirPath()+"/temp"))
        return;
//Вызов функции обновления файла паролей
    updatePgPassFile(QString("%1:%2:%3:%4:%5")
                     .arg(host,
                          ui->port->text(),
                          name,
                          postgresUser,
                          ui->password->text()));
    system(qPrintable("cmd.exe /c \""+
                      QDir::toNativeSeparators(
                          QString("%1/%2")
                          .arg(QCoreApplication::applicationDirPath()+"/temp")
                          .arg(fileName)+"\"")));
}
PostgreSQL, Qt, Базы данных

Файл паролей PostgreSQL pgpass в Windows

Для восстановления базы данных из резервной копии используется исполняемый файл сервера pg_restore. Если в настройках сервера выставлена авторизация по имени и паролю, то при использовании утилиты необходимо вводить пароль при каждой операции восстановления БД из бэкапа. Что не подходит в случае пакетной операции, например, или когда операция должна производится без взаимодействия с пользователем в этом ключе. Тогда сервер использует файл паролей pgpass. Он может и отсутствовать. Что тогда делать? Создать и обновлять. Продолжить чтение «Файл паролей PostgreSQL pgpass в Windows»

PostgreSQL, Qt, Базы данных

Путь к каталогу bin PostgreSQL Windows

Задача: получить значение пути к каталогу бинарников сервера — к каталогу bin. Путь к каталогу data, как и прочие значения параметров времени выполнения, найти совершенно несложно: достаточно выполнить запрос show, воспользоваться функцией current_setting() или обратиться к представлению pg_settings:

[pastacode lang=»sql» manual=»show%20data_directory%3B%0Aselect%20current_setting(‘data_directory’)%3B%0Aselect%20setting%20from%20pg_settings%20%0A%20%20%20where%20name%20%3D%20’data_directory’%3B» message=»Три равнозначных примера получения значения пути к каталогу data» highlight=»» provider=»manual»/]

Еще парочку примеров показывала вот в этой записи: Количество подключений к БД PostgreSQL.

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

Итак, интересующий нас ключ: Продолжить чтение «Путь к каталогу bin PostgreSQL Windows»

PostgreSQL

Количество подключений к БД PostgreSQL

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

select count(datid) from pg_stat_activity
where datname = 'table_name'

Представление pg_stat_activity очень интересное: можно узнать последний выполненный запрос клиента, его IP, состояние и много чего другого, о чем можно прочитать в документации.

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

show max_connections

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

show config_file

А какие именно манипуляции с файлом производить, неплохо написано вот тут.

О том, как узнать размер таблиц и баз данных, можно ознакомиться в сообщении PostgreSQL: Размер таблиц и базы данных

PostgreSQL

PostgreSQL: Размер таблиц и базы данных

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

select table_name, pg_size_pretty( pg_total_relation_size(table_name)) 
from information_schema.tables 
where table_schema = 'table_schema_name' and
table_catalog = 'database_name';

Этот запрос вернет полный размер таблицы, включая индексы и данные TOAST. Чтоб узнать размер таблицы без индексов ( но включая TOAST, карту свободного места и карту видимости ) воспользуйтесь функцией pg_table_size. pg_relation_size() — чтоб узнать объём, который занимает на диске указанный слой (‘main’, ‘fsm’, ‘vm’, ‘init’) заданной таблицы или индекса. Про некоторые другие функции получения размера объектов можно почитать в документации.

Узнать размер баз данных на сервере:

select datname, pg_size_pretty(pg_database_size(datname)) 
from pg_database;

pg_size_pretty возвращает значение размера объектов в удобочитаемом для человека виде, например 36 MB. Однако можно использовать выше указанные функции напрямую. Тогда размер объектов вернется в байтах.

PostgreSQL, Qt

PostgreSQL: unnest(array)

Моя любимая функция PostgreSQL — unnest (ссылка на документацию)! Она такая простая, но такая классная 😀

Она очень пригодится, если нужно вставить сразу несколько записей за один присест. Допустим, у одной фирмы есть несколько номеров телефонов и, чтобы не перечислять вставку этих данных через запятую, дублируя id фирмы, можно использовать unnest — элегантное решение! Продолжить чтение «PostgreSQL: unnest(array)»

Microsoft SQL Server, PostgreSQL, SQL

PostgreSQL и MSSQLServer: Ограничение количества отображаемых строк выборки

Вывести первые 100 строк запроса:

[pastacode lang=»sql» manual=»select%20*%20from%20table_name%0Aorder%20by%20id%0Alimit%20100″ message=»PostgreSQL limit» highlight=»3″ provider=»manual»/]

[pastacode lang=»sql» manual=»select%20*%20from%20table_name%20%0Afetch%20next%20100%20rows%20only» message=»PostgreSQL fetch» highlight=»2″ provider=»manual»/]

[pastacode lang=»sql» manual=»select%20*%20from%20table_name%0Aorder%20by%20id%0Aoffset%200%20rows%20fetch%20next%20100%20rows%20only» message=»Microsoft SQL Server offset…fetch» highlight=»3″ provider=»manual»/]

Вывести 100 строк выборки, пропустив 20 строк:

[pastacode lang=»sql» manual=»select%20*%20from%20table_name%0Aorder%20by%20id%0Alimit%20100%20offset%2020″ message=»PostgreSQL limit…offset» highlight=»3″ provider=»manual»/]

[pastacode lang=»sql» manual=»select%20*%20from%20table_name%20%0Aoffset%2020%20rows%20fetch%20next%20100%20rows%20only» message=»PostgreSQL offset…fetch» highlight=»2″ provider=»manual»/]

[pastacode lang=»sql» manual=»select%20*%20from%20table_name%0Aorder%20by%20id%0Aoffset%2020%20rows%20fetch%20next%20100%20rows%20only» message=»Microsoft SQL Server offset…fetch» highlight=»3″ provider=»manual»/]

Стоит отметить, что для использования предложения OFFSET и FETCH в MSSQLServer требуется ORDER BY. В PostgreSQL — нет. В MS SQL Server использование offset без fetch запрещено. В PostgreSQL — нет.

Для ограничения количества выводимых строк без сдвига для Microsoft SQL Server можно воспользоваться оператором top:

[pastacode lang=»sql» manual=»select%20top%20100%20*%0Afrom%20table_name%0Aorder%20by%20id» message=»Microsoft SQL Server top» highlight=»1″ provider=»manual»/]

Документация: PostgreSQL, MSSQLServer (offset…fetch, top).