LINUX.ORG.RU

Сообщения polin11

 

Как запретить в триггере вставку пустого jsonb

Форум — General

СУБД Postgresql, нужно в триггере запретить вставку в поле пустого ‘{}’::jsonb

Пробовал что-то подобное, но не работает

BEGIN

IF NEW.«Param» = ‘{}’::jsonb THEN

  DELETE FROM "Table1" WHERE "Key" = NEW."Key";

  RETURN NULL;

END IF;

RETURN NEW;

END;

 ,

polin11
()

Инициализация членов класса

Форум — General

Подскажите ответ на вопрос, не смог ничего нагуглить

Where do you initialize a non-static class member that is a reference?

  1. Point of declaration only

  2. Member initialization list only

  3. Point of declaration and member initialization list

  4. Member initialization list and body of constructor

  5. Body of constructor only

 

polin11
()

Запрос с использованием массива

Форум — General

Использую СУБД PostgreSQL. Для примера, есть таблица 1 столбец - имя владельца 2 столбец - название авто

CREATE TABLE cars (
  id INT NOT NULL,
  name VARCHAR(30) NOT NULL,
  car VARCHAR(30)
);

INSERT INTO cars 
    (id, name, car) 
VALUES 
    (1,'John', 'BMW'),
    (2,'Mike', 'BMW'),
    (3,'John', 'OPEL'),
    (3,'John', 'KIA')
Есть набор названий авто ['BMW', 'KIA'], нужно найти владельцев, которые владели всеми этими авто. Придумал 2 варианта реализации:
SELECT name
FROM cars
WHERE car =  'BMW'
INTERSECT
SELECT name
FROM cars
WHERE car =  'KIA'
Либо
SELECT name
FROM cars
WHERE car =  ANY(ARRAY['BMW', 'KIA'])
GROUP BY name
HAVING COUNT(name) = 2
Вопрос, есть ли другие более оптимальные и простые варианты реализации

 ,

polin11
()

PostgreSQL и обратный слэш

Форум — General

В PostgreSQL есть прекрасная функция quote_literal, при помощи нее оборачиваю строи из PostgreSQL, заем эти данные идут для вставки в СУБД SQLite.

Проблема возникла если в строке обратный слэш:

select quote_literal(‘\AA’)

я получаю

E’\AA’

из-за префикса E, такие данные не вставляются в SQLite

Вопрос, как избавиться от этого префикса, не удаляя бэк слэш из данных?

 ,

polin11
()

Предупреждение pylint Unused variable

Форум — Development

Предупреждение pylint Unused variable

Есть некоторое действие, которое нужно повторить N раз, например вывести слово python, пример

def f(n):
    for i in range(n):
        print('python')

f(10)
Но при проверке pylint есть предупреждение, Unused variable 'i' (unused-variable)

Как решить такую проблему?

 

polin11
()

Индекс для сортировки

Форум — General

СУБД PostgreSQL, таблица Документы первичный ключ Документ, поле Код типа text. Есть запрос

SELECT s.*
FROM "Документы" s
where "Документ" = ANY(ARRAY[807830, 807831, 807832, 807833, 807834, 807835, 807836, 807837, 807838, 807839
])
ORDER BY
s."Код"

Создал индекс

CREATE INDEX "index_sort"
	ON "Документы" USING btree
	("Документ" NULLS LAST, "Код" text_pattern_ops NULLS LAST);

Но почему-то планировщик его не использует, делал VACUUM, REINDEX, используется индекс по первичному ключу, план такой:

"Sort  (cost=48.74..48.77 rows=10 width=174) (actual time=0.061..0.062 rows=10 loops=1)"
"  Sort Key: "Код"
"  Sort Method: quicksort  Memory: 26kB"
"  Buffers: shared hit=31"
"  ->  Index Scan using "pДокумент" on "Документы" s  (cost=0.42..48.58 rows=10 width=174) (actual time=0.013..0.025 rows=10 loops=1)"
"        Index Cond: ("Документ" = ANY ('{807830,807831,807832,807833,807834,807835,807836,807837,807838,807839}'::integer[]))"
"        Buffers: shared hit=31"
"Planning time: 0.168 ms"
"Execution time: 0.077 ms"

Как заставить планировщик использовать индекс?

 ,

polin11
()

Сортировка в запросе по массиву

Форум — General

Есть массив значений [4,6,5,1] некоторого поля.

Получаем записи со значениями из этого массива. [code] select * from T where Filed1=ANY(ARRAY[4,6,5,1]) [/code]

Вопрос:

Нужно чтобы записи были в том порядке в котором значения в массиве, то есть Запись1 со значением 4 Запись2 со значением 6 Запись3 со значение 5 Запись4 со значением 1

Можно использовать UNION c каждым значением по отдельности

[code] select * from T where Filed1=4 …. union select * from T where Filed1=1 [/code]

Вопрос: Можно ли добиться такой сортировки без использования UNION(UNION ALL), может быть ORDER BY

 

polin11
()

GitLab узнать разницу между веткой и тэгом, исключив один коммит

Форум — General

В GitLab при создании ветки master, создается тэг tag_master. В процессе работы в master сливаются другие ветки, когда нужно узнать какие файлы были изменены в master берем diff между веткой и тэгом, типа

git diff –name-only tag_master

Вопрос: есть одна ветка (any_branch_master состоит из 1 коммита), которую слили в master(она там должна быть). Мне нужно получить diff между master и tag_master, но исключив из списка файлы измененные в any_branch_master, как это сделать?

 , , ,

polin11
()

Получение набора записей по курсору

Форум — General

СУБД Postgresql есть таблица с городами и странами.

CREATE TABLE T (
  id INTEGER,
  town_country VARCHAR (255),
  is_country bool
) ;--DEFAULT CHARSET=utf8 ;

INSERT INTO T
  (id, town_country, is_country)
VALUES
  (1, 'Франция', true),
  (2, 'Германия', true),
  (4, 'Россия',  true),
  (5, 'Канада', true),
  (6, 'Бельгия',  true),
  (7, 'Беларусь', true),
  (8, 'Австралия', true),
  (9, 'Япония', true),
  (10, 'Афины', null),
  (11, 'Брюссель', null),
  (12, 'Барселона', null)
Отсортированный список
SELECT *
FROM T
ORDER BY
 is_country DESC NULLS LAST, 
 town_country ASC NULLS FIRST
Австралия Беларусь Бельгия Германия Канада Россия Франция Япония Афины Брюссель Барселона

Нужно написать несколько запросов, которые возвращают по 5 записей из этого списка. Начиная со 2 запроса, нужно в условие запроса передать последнюю запись, найденную в предыдущем запросе.

Первый запрос без условия:

SELECT *
FROM T
ORDER BY
 is_country DESC NULLS LAST, 
 town_country ASC NULLS FIRST
LIMIT 5
Получаем набор, все ОК:

Австралия Беларусь Бельгия Германия Канада

https://www.db-fiddle.com/f/SpTXQTSprkMr3syfk6DSE/0

Берем последнюю запись - Канада, нужно получить следующие 5 записей, которые находятся в списке под Канадой, например так

Второй запрос:

SELECT *
FROM T
where town_country > 'Канада'
ORDER BY
 is_country DESC NULLS LAST, 
 town_country ASC NULLS FIRST
 LIMIT 5
 
https://www.db-fiddle.com/f/39cbZdNmr4HzVzsS1mnfxy/0

Проблема: возвращается только 3 записи (Россия, Франция, Япония), из-за использования сортировки is_country DESC NULLS LAST

Третим запросом нужно вернуть одну запись: Барселона

Как правильно написать 2 и 3 запросы, оставив такую сортировку, во 2 запросе нужно использовать последнюю запись из 1 запроса, в 3 запросе нужно использовать последнюю запись из 2 запроса?

 

polin11
()

Заархивировать папку с нужной кодировкой

Форум — General

Создаю архив в Windows os.system(«C:\Program Files\7-Zip\7z.exe» a FILE.zip D:\data*) при извлечении файлов из архива, имена файлов корректно отображаются (предположительно кодировка utf-8).

Решил использовать zip.ZipFile() или shutil.make_archive() при попытке получить имена файлов из архива, они в непонятной кодировке. Вопрос: можно ли при формировании архива через zip.ZipFile() или shutil.make_archive() указать кодировку имен файлов в архиве?

 

polin11
()

Python создать архив под linux

Форум — General

Создаю архив в Windows

os.system(«C:\Program Files\7-Zip\7z.exe» a FILE1.zip D:\data*)

Нужно сделать тоже самое под CentOS 7, не хочется устанавливать CentOS 7, правильно ли я понимаю, что нужно по аналогии указать путь до установленного архиватора 7z.exe и путь к каталогу, что-то типа?

os.system(«/home/7-Zip/7z.exe» a FILE1.zip /home/UserName/desktop/data*)

Знатоки linux подскажите пожалуйста

 ,

polin11
()

Неиспользуемые индексы

Форум — General

Использую СУБД Postgresql. Есть много запросов, при помощи, которых можно узнать какие индексы не используются: например

SELECT relname, indexrelname, idx_scan
FROM   pg_catalog.pg_stat_user_indexes
WHERE  schemaname = 'public' and idx_scan = 0;
Мне не понятно за какой промежуток времени отображается такая статистика, за все время использования этой БД? Мне было бы интересно узнать эту информацию начиная с определенной даты, например неделю назад я переписал SQL запросы, хочу с этой даты узнать какие индексы перестали использоваться, как это сделать?

 ,

polin11
()

Идентификаторы при вставке записей Postgresql

Форум — General

Использую СУБД PostgreSQL, вставляю записи в таблицу Контакты, поле Контакт - поле c id. Вставку делаю записей при помощи PGCOPY. Вставляемые записи являются частью иерархического списка, у каждой записи есть поле Родитель - id родителя. Я получаю массив id вставляемых записей:

SELECT array_agg(nextval(seq)) «arr»

FROM generate_series(1, 10 ), pg_get_serial_sequence(«Контакты», «Контакт») seq

затем заполняю поле Родитель из полученного массива id и через PGCOPY вставляю записи. Все хорошо работает, но если между получением массива id и вставкой записей, будет добавлена левая запись при помощи INSERT, то будет использован id из массива и иерархия нарушится. Вопрос такой: есть ли возможность в PostgreSQL забронировать некоторый диапазон id, то есть я получаю массив id, этот массив бронируется и при последующей вставке через INSERT с автоинкриментом id из этого массива не используются.

 ,

polin11
()

Работа с массивами данных

Форум — General

Субд SQLite. Есть массив строк [ 'one', 'two'], нужно получить элементы, которых нет в таблице, что-то типа такого

with T as(select 'one', 'two')

select * from T

EXCEPT

select field from Table Where field In (select * from T)

но это не работает SELECTs to the left and right of EXCEPT do not have the same number of result columns

 

polin11
()

SQL запрос с массивами

Форум — General

Использую СУБД postgresql. Помогите написать запрос. Есть 3 массива со значениями 3 полей таблицы A[a1,a2], B[b1,b2], C[c1,c2] соответственно. Есть запрос:

SELECT *
FROM T
WHERE Field1 = a1 AND Field2 = b1 AND Field3 = c1
UNION
SELECT *
FROM T
WHERE Field1 = a2 AND Field2 = b2 AND Field3 = c2
То есть нужно найти все записи, значения полей которых равны наборам из массивов (a[N],b[N],c[N]). Если массивы большие размером, не хочется лепить запрос через UNION, он выполняется долго и размер этого запроса большой. Может быть можно сократить, что-то типа такого
SELECT *
FROM T
WHERE Field1 = ANY(ARRAY[a1,a2,a3]) AND Field2 = ANY(ARRAY[b1,b2,b3]) AND Field3 = ANY(ARRAY[c1,c2,c3])
Но в таком виде запрос работает неверно, возвращает записи в полях которых входит хотя бы одно значение массива из каждого массива.

 , ,

polin11
()

Update с использованием рекурсивного запроса

Форум — General

Использую postgresql. Есть иерархическая таблица, поле с иерархией parent_id, нужно заполнить level - уровень вложенности, hier - строка с названиями родителями (исключая корень таблицы), root - значения корня иерархии (если у предка в поле new_root = true, то у потомков в поле root должен быть id этого предка). Пример можно посмотреть https://www.db-fiddle.com/f/ezdc4n5ivhHrHk6rDJgZUo/0

Посоветуйте, как можно улучшить запрос???

 , ,

polin11
()

SQLite Выполнить последовательно INSERT и UPDATE

Форум — General

Перешел с postgresql на sqlite работаю при помощи dbeaver. Есть файл состоит из нескольких SQL команд разделенных точкой с запятой. Например нужно последовательно выполнить 2 Sql запроса на INSERT и UPDATE:

INSERT INTO «Коды» ( «Код») VALUES ( «Начало» );

UPDATE «Коды» SET «Название» = 'НОВОЕ ИМЯ' where «Код» = «Начало»;

Запись вставляется, но не обновляется название. На postresql все ок. Пробовал обернуть в транзакцию типа:

BEGIN TRANSACTION;

INSERT INTO «Коды» ( «Код») VALUES ( «Начало» );

UPDATE «Коды» SET «Название» = 'НОВОЕ ИМЯ' where «Код» = «Начало»;

COMMIT;

не помогло. Как решить проблему

 

polin11
()

Использование CAST и IS NOT

Форум — General

Нужно используя стандартный SQL написать запрос, который работает и на postgres и на sqlite Запрос для sqlite работает прекрасно select * from «Table1» where «Field1» is not CAST('false' AS BOOLEAN)

Для postgres не работает ошибка синтаксиса (примерное положение: «CAST») почему для меня не понятно, вопрос как используя стандартный SQL написать запрос для обеих СУБД?

 ,

polin11
()

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

Форум — General

Использую СУБД postgresql. Есть иерархическая таблица с каталогами данных (в примере корнями каталогов являются Корень1, Корень2 у них поле parent и root заполнено null) Рабочий пример

https://www.db-fiddle.com/f/2hbRo3qUfhwACNHVBxy3A9/0

CREATE TABLE rec ( id INTEGER, full_code VARCHAR (255), code VARCHAR (255), parent INTEGER, root INTEGER, is_node bool ) ;–DEFAULT CHARSET=utf8 ;

INSERT INTO rec (id, full_code, code, parent, root, is_node) VALUES (1, ‘Корень1’,‘Корень1’, null, null, true), (2, ‘Корень1.2017-12-31’, ‘2017-12-31’, 1, 1, false), (3, ‘Корень1.2016-12-31’, ‘2016-12-31’, 1, 1, false), (4, ‘Корень1.2015-12-31’, ‘2015-12-31’, 1, 1, false), (5, ‘Корень1.111’, ‘111’, 1, 1, null), (6, ‘Корень1.111’, ‘111’, 4, 4, null), (7, ‘Корень1.111’, ‘111’, 3, 3, null), (8, ‘Корень1.111’, ‘111’, 2, 2, null), (9, ‘Корень1.222’, ‘222’, 2, 2, null), (10, ‘Корень1.333’, ‘333’, 3, 3, null), (11, ‘Корень2’,‘Корень2’, null, null, true)

В каждом каталоге есть папки с датой, в этой папке лежат записи актуальные до указанной даты, у таких папок поле is_node имеет значение false.

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

  1. если full_code = ‘Корень1.111’ Дата = ‘2017-02-02’, то должно вернуться (8, ‘Корень1.111’, ‘111’, 2, 2, null)
  2. если full_code = ‘Корень1.111’ Дата = ‘2019-02-02’, то должно вернуться из корня запись (5, ‘Корень1.111’, ‘111’, 1, 1, null)
  3. если full_code = ‘Корень1.111’ Дата = ‘2012-02-02’, то должно ничего не вернут, так как есть папка с датой 2015-12-31 в ней нет записи с кодом ‘Корень1.111’
  4. если full_code = ‘Корень1’ Дата = ‘2017-02-02’, то должно вернуться (2, ‘Корень1.2017-12-31’, ‘2017-12-31’, 1, 1, false)
  5. если full_code = ‘Корень1’ Дата = ‘2019-02-02’, то должно вернуться (1, ‘Корень1’,‘Корень1’, null, null, true)
  6. если full_code = ‘Корень1.2017-12-31’ Дата = ‘2019-02-02’, то должно вернуться (1, ‘Корень1’,‘Корень1’, null, null, true)

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

WITH ROOT AS( select ( case WHEN r1.root is NULL THEN r1.id
WHEN r1.is_node is False THEN r1.root
else (select case WHEN r2.root is NULL THEN r2.id else r2.root end from catalog r2 where r2.id = r1.root LIMIT 1) end ) as root from catalog r1 where r1.full_code = ‘Корень1.111’ limit 1), T AS( select id from catalog where (parent = (select * from root) and is_node is false
AND code >= ‘2017-02-02’::text) OR id= (select * from root) ORDER BY parent NULLS LAST, code LIMIT 1 ), IDS AS( select ( select * from T ) as id from catalog where (parent is null or is_node is false) and full_code = ‘Корень1.111’ union select id from catalog where root = (select * from t) and full_code = ‘Корень1.111’ and (parent is not null and is_node is not false) limit 1) SELECT * FROM catalog where id in (select * from ids)

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

  1. Как упростить запрос?
  2. Главный вопрос, как написать запрос, если передан массив полных кодов, и нужно получить массив актуальных записей. Даже нет идей, как решить этот вопрос???

 ,

polin11
()

Git api запушить файл с кодировкой CP-1251

Форум — General

Использую gitlab api https://docs.gitlab.com/ee/api/commi...es-and-actions

Пушу файл в git хранилище используя параметры так

param = {
                "branch": branch_name,
                "commit_message": comment,
                "actions": [{
                        "action": "create",
                        "file_path": file_path,
                        "content": file_content,
                         "encoding":"text"
                }]
        }

file_content питоновская строка бинарные данные.

Файл пушиться, но создается в кодировке UTF-8, нужно в CP-1251, кто подскажет как это сделать и возможно ли это???

 ,

polin11
()

RSS подписка на новые темы