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, SQL, Базы данных

Оптимизация запросов PostgreSQL с explain analyze

Один недавний занимательный разговор на тему SQL вообще и оптимизации запросов — в частности, натолкнул меня на исследование быстродействия выполнения некоторого типа запросов. Потому что я не была уверена в этом вопросе. И мне это не понравилось 🙂 Специально для такого дела создала БД с 3 таблицами. В этом посте буду использовать только 2 из них, возможно, 3-ю задействую в других тестах. Для работы воспользуемся командой explain analyze.

Первая таблица cities содержит минимальную информацию о некоторых городах. Таблица people — о некоторых людях. И таблица phonebook хранит данные телефонного справочника. PostgreSQL 10. Продолжить чтение «Оптимизация запросов PostgreSQL с explain analyze»

Microsoft SQL Server, PostgreSQL, Базы данных

Триггер на групповую вставку в таблицу в Microsoft SQL Server

Многие СУБД (например, MySQL, PostgreSQL и т.д.) умеют правильно обрабатывать события по групповой вставке данных в таблицы. Но не все. Например, триггер на групповую вставку в таблицу в Microsoft SQl Server будет отличаться. Рассмотрим примеры запросов:

[pastacode lang=»sql» manual=»insert%20into%20people%0Aselect%20name%2C%20surname%2C%20age%20from%20portfolio%3B» message=»» highlight=»» provider=»manual»/]

Или такой:

[pastacode lang=»sql» manual=»insert%20into%20people(name%2C%20surname%2C%20age)%20values%0A(‘John’%2C%20’Smith’%2C%2012)%2C%0A(‘Ann’%2C%20’Black’%2C%2029)%2C%0A(‘Samantha’%2C%20’Doeson’%2C%2038)%3B» message=»» highlight=»» provider=»manual»/]

Продолжить чтение «Триггер на групповую вставку в таблицу в Microsoft SQL Server»

Microsoft SQL Server, Qt

QSqlQuery::numRowsAffected(), QSqlQuery::size() и MS SQL Server

Для получения количества обработанных записей запросом (insert, update, delete) в Qt используют функцию numRowsAffected(), а для получения размера выборки — size() объекта QSqlQuery:

[pastacode lang=»cpp» manual=»QSqlQuery%20query%3B%0Aif%20(!query.exec(%22delete%20from%20people%20where%20age%20%3C%2020%22))%20%7B%0A%09qDebug()%20%3C%3C%20%22error%3A%22%20%3C%3C%20query.lastError()-%3Etext()%3B%0A%09return%3B%0A%7D%0AqDebug()%20%3C%3C%20%22rows%20count%22%20%3C%3C%20query.numRowsAffected()%3B» message=»numRowsAffected()» highlight=»6″ provider=»manual»/]

[pastacode lang=»cpp» manual=»QSqlQuery%20query%3B%0Aif%20(!query.exec(%22select%20*%20from%20people%20where%20age%20%3C%2035%22))%20%7B%0A%09qDebug()%20%3C%3C%20%22error%3A%22%20%3C%3C%20query.lastError()-%3Etext()%3B%0A%09return%3B%0A%7D%0AqDebug()%20%3C%3C%20%22rows%20count%22%20%3C%3C%20query.size()%3B» message=»size()» highlight=»6″ provider=»manual»/]

Но не все СУБД поддерживают эту функцию. Например, SQLite и, о Боже! — Microsoft SQL Server (как не стыдно!). Проверить поддержку данной функции (а заодно и функции QSqlQuery::size()) можно так:

[pastacode lang=»cpp» manual=»qDebug()%20%3C%3C%20database.driver()-%3EhasFeature(QSqlDriver%3A%3AQuerySize)%3B» message=»» highlight=»» provider=»manual»/]

где database — объект подключения к базе данных QSqlDatabase. Если в выводе приложения вы увидите false, то прогноз пессимистичен.

Что делать в этом случае?

Продолжить чтение «QSqlQuery::numRowsAffected(), QSqlQuery::size() и MS SQL Server»

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

Способы выполнения запросов к базе данных в Qt

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

[pastacode lang=»cpp» manual=»%23include%20%3CQSqlQuery%3E%0A%23include%20%3CQSqlError%3E%20%2F%2F%D0%B4%D0%BB%D1%8F%20%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4%D0%B0%20%D0%BE%D1%88%D0%B8%D0%B1%D0%BE%D0%BA%20%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%BE%D0%B2%0A%23include%20%3CQDebug%3E%20%2F%2F%D0%B4%D0%BB%D1%8F%20%D0%B2%D1%8B%D0%B2%D0%BE%D0%B4%D0%B0%20%D0%BE%D1%82%D0%BB%D0%B0%D0%B4%D0%BE%D1%87%D0%BD%D0%BE%D0%B9%20%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D0%B8″ message=»» highlight=»» provider=»manual»/]

Пусть в базе данных имеется таблица следующего вида:

[pastacode lang=»sql» manual=»CREATE%20TABLE%20tableName%0A(%0A%20%20id%20integer%20NOT%20NULL%2C%0A%20%20fieldName%20character%20varying(100)%20NOT%20NULL%2C%0A%20%20CONSTRAINT%20entities_pkey%20PRIMARY%20KEY%20(id)%0A)» message=»Таблица в PostgreSQL» highlight=»» provider=»manual»/]

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

Способ 1: QString

[pastacode lang=»cpp» manual=»QSqlQuery%20query%3B%0Aif%20(!query.exec(QString(%22select%20*%20from%20tableName%20%22%0A%09%09%09%09%09%09%22where%20fieldName%20like%20’%251’%20%22%0A%09%09%09%09%09%20%20%20%22order%20by%20id%22).arg(%22%25%D0%B8%D0%BC%D1%8F%25%22)))%0A%09qDebug()%20%3C%3C%20query.lastError().text()%3B» message=»Через строку с параметрами» highlight=»» provider=»manual»/]

Задаем строку запроса, вместо изменяющихся величин задаем параметры через «%».

Способ 2: bindValue

[pastacode lang=»cpp» manual=»QSqlQuery%20query%3B%0Aquery.prepare(%22select%20*%20from%20tableName%20%22%0A%09%09%09%22where%20fieldName%20like%20%3Aparam%20%22%0A%09%09%09%22order%20by%20id%22)%3B%0Aquery.bindValue(%22%3Aparam%22%2C%20QVariant(%22%25%D0%B8%D0%BC%D1%8F%25%22))%3B%0Aif%20(!query.exec())%0A%09qDebug()%20%3C%3C%20query.lastError().text()%3B» message=»Через bindValue» highlight=»» provider=»manual»/]

Преобразование QVariant() передаст в запрос параметр нужного типа.

Способ 3. addBindValue

[pastacode lang=»cpp» manual=»QSqlQuery%20query%3B%0Aquery.prepare(%22select%20*%20from%20tableName%20%22%0A%09%09%09%22where%20fieldName%20like%20%3F%20%22%0A%09%09%09%22order%20by%20id)%3B%0Aquery.addBindValue(QVariant(%22%25%D0%B8%D0%BC%D1%8F%25%22))%3B%0Aif%20(!query.exec())%0A%09qDebug()%20%3C%3C%20query.lastError().text()%3B» message=»Через addBindValue» highlight=»» provider=»manual»/]

Здесь явно не указываются параметры. addBindValue последовательно по тексту запроса подставляет указанные значения параметров.