C++, SQL, SQLite

Аналог UNNEST в SQLite

Такой удобной функции, как UNNEST, в SQLite нет (пссс, об UNNEST в PostgreSQL я писала вот здесь). А что использовать, если нам нужно элементы некоего массива/списка/контейнера впихнуть в один запрос вставки данных, например? Можно воспользоваться WITH и VALUES.

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

with cte_code(id,code) as (
select rowid, a.* from 
	(values('111'),('222'),('333')) as a),
cte_dates(id,date) as (
select rowid, b.* from 
	(values('2022-08-09'),('2022-08-10'),
	 ('2022-08-11')) as b)

insert into ones(task_id, code, date)
select 1, a.code, b.date
from cte_code a 
inner join cte_dates b on b.id = a.id
Списки поотдельности

cte_code — список кодов, cte_dates — список дат. task_id — некая константа.

with cte_pairs(code, date) as (
select * from 
	(values('111', '2022-08-09'),
	 ('222', '2022-08-10'),
	 ('333', '2022-08-11')))

insert into ones(task_id, code, date)
select 1, a.code, a.date
from cte_pairs a
Спарованный список

cte_pairs — оба наших списка в одном.

Строка запроса в Qt C++, учитывая наличие QStringList codes и QStringList dates, может выглядеть так:

QStringList codes, dates;
QString qry = QString("with cte_code(id,code) as ( "
					  "select rowid, a.* from "
					  "(values('%2')) as a), "
					  "cte_dates(id,date) as ( "
					  "select rowid, b.* "
					  "from (values('%1')) as b) "
					  
					  "insert into ones(task_id, code, date) "
					  "select 1, a.code, b.date "
					  "from cte_code a "
					  "inner join cte_dates b on b.id = a.id")
	.arg(dates.join("'), ('"))
	.arg(codes.join("'), ('"));
Музыка♥, О том о сём

Не подпиской на Яндекс.Музыку единой

Эх, хорошо же мы жили с Яндекс.Музыкой и подпиской Плюс. И сказки нон-стоп для дочери, модная-молодежная музыка и подкасты для сына, старенькая и чуть новенькой музыки для нас с мужем. Аудио-произведения. Мой любимый Кино Поиск на Плюс подписке без рекламы! Яндекс.Такси со скидочкой. Да чего там только нет — очень удобно. И в свете недавних (кстати, уже почти 4 месяца уже), всем известных событий наши карты перестали приниматься платежной системой Яндекс.Музыки. Ни одна из валютных, ни рублевые. Эх. К своему удивлению узнала, что головное юридическое лицо компании находится в Нидерландах. Как я заблуждалась, оказывается, думая, что это чисто российская контора.

Однако без подписки Яндекс.Музыка осталась доступной в качестве радио на ПК.

Небольшой плей-листик песенок, запавших в душу (какие-то из них старые-добрые, какие-то для меня новенькие):

P!nk — U + Ur hand ❤️
Red — Who We Are
Thirty Seconds To Mars — A Modern Myth ❤️❤️❤️
Selena Gomes & The Scene — Who Says
Madilyn Bailey — Red Ribbon ❤️❤️❤️
Christina Perri — Human ❤️
Ashes Remain — Everything Good ❤️
Panic! At The Disco — House Of Memories (вам не кажется, что эта песенка стала «официальным» саундтреком к видосам про суд между Джонни Деппом и Эмбер Хёрд? 😆 Я последние заседания смотрела в прямом эфире в оригинале, прям интересно было. Никогда не следила за знаменитостями и вот опять 😆).
Stone Sour — Hesitate
Apocalyptica & Adam Gontier — I Don’t Care (ностальгия и любовь ❤️‍🔥❤️‍🔥❤️‍🔥❤️‍🔥)
и как же без Papa Roach — Scars ❤️.

PostgreSQL

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

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

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

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

COMMENT ON COLUMN public.products.product_id
    IS 'Комментарий';
Добавление комментария к колонке

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

select subq.attname::text, d.description
	FROM 
		(SELECT c.relname, obj_description(c.oid) obj_description, a.attname, c.oid, a.attnum
		FROM pg_class c, pg_attribute a
		WHERE c.oid = a.attrelid
		AND c.relname in ('products')
		AND a.attnum > 0) subq 
	LEFT OUTER JOIN pg_description d ON (d.objsubid = subq.attnum AND d.objoid = subq.oid)
	where subq.attname not ilike '%pg.dropped%';
Имена колонок таблицы products и комментарии к ним

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

 

Мысли вслух

Ветка сакуры упала на грудь…

Помните такой стишок: «Ветка сирени упала на грудь. Милый мой Коля (имя можно изменить), меня не забудь»? 😂

На новом участке посадим перед домом сакуру — она небольшая ростом, и электрическим проводам мешать не будет. А какая красота по весне…

А рядышком — магнолию — для еще пущей сказочности.

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

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

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

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

select json_agg(t) from
(select * from products) t
json_agg
select json_agg(t) from
(select product_id, min_storage_temp, max_storage_temp 
 from products where coalesce(min_storage_temp,'') <> '') t
Получить данные указанных полей

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

[
{
«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:

select row_to_json(t) FROM 
(select * from products where product_id = '123') t
row_to_json

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

"Нет" выгоранию, Музыка♥

Love sux but music doesn’t

Мой недобложик жил без меня почти два года, юху! Какой самостоятельный вырос 😅

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

Включила вот себе послушать свеженький альбом Avril Lavigne — Love Sux. Люблю ее еще со школы. Ну а сейчас я уже давно не в школе и даже не в университете 😁

Такие вот песенки меня зацепили:

Avalanche

Deja vu

Dare to love me

Слушала через Яндекс Музыку, да, удобно иметь подписку 😇

PostgreSQL, SQL

Прервать соединения IP с базой данных в PostgreSQL

В сообщении Принудительное удаление базы данных в PostgreSQL я писала о том, как принудительно закрыть все соединения с базой данных. Это удобно, когда есть «висящие» соединения, которые никак не хотят завершаться. Или нужно срочно удалить базу данных и нет времени выяснять, кто забыл от нее отключиться 🙂 Сегодня я хочу показать, как прервать соединения IP с базой данных.

Сначала выведем количество подключений с каждого IP к базе данных: Продолжить чтение «Прервать соединения IP с базой данных в PostgreSQL»

Qt

Динамическое создание виджетов Qt. QGridLayout

В этом сообщении хотелось бы немного отредактировать предыдущий подобный пост Qt. Динамическое создание виджетов на форме.

Задача такая же: Есть объект QGroupBox groupBox, в него надо запихнуть виджеты (labels & lineEdits) в QGridLayout лэйауте. Данные берутся из запроса (он представлен в сообщении по ссылке выше).

Более универсальный способ будет выглядеть так:

if(ui->groupBox->layout()) {
	QLayoutItem *child;
    while ((child = ui->groupBox->layout()->takeAt(0)) != 0) {
    	delete child->widget();
        delete child;
    }
    delete ui->groupBox->layout();
}
QGridLayout *layout = new QGridLayout(ui->groupBox);
ui->groupBox->setLayout(layout);
int pos = 0; //устанавливаем позицию расположения виджетов в 0
int colsCount = 2; //Количество колонок в лэйауте
while (query.next()) { //берем результаты запроса
	QLabel *newLabel = new QLabel(this);
    newLabel->setText(query.value("caption").toString()+":");
    newLabel->setObjectName("label_"+query.value("name_").toString());
    layout->addWidget(newLabel,pos/colsCount,pos%colsCount);
    pos++; //сдвигаемся

    QLineEdit *newEdit = new QLineEdit(this);
    newEdit->setObjectName(query.value("name_").toString());
    layout->addWidget(newEdit,pos/colsCount,pos%colsCount);
    lineEdits.push_back(newEdit);
    pos++;
}

В данном случае мне необходимо было разместить объекты в бокс с двумя колонками. Поэтому colsCount = 2. Если их должно быть больше, то значение переменной нужно поменять. Очищение лэйаута позволяет при изменении результатов запроса все очистить и нарисовать все в соответствии с актуальными данными.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Инфо обо мне