
Yaroslav
10.05.2018
12:49:32

Alexandr
10.05.2018
12:50:16
так в issue по ссылке выше говорилось что ошибка связана с работой приложения через pgbouncer в transaction mode

Yaroslav
10.05.2018
12:53:58

Google

Yaroslav
10.05.2018
12:54:19

Denis
10.05.2018
12:56:35
pgbouncer
через JetBrain-овскую IDE к базе коннектитесь? они ставят read-only на сессию по умолчанию.

Alexandr
10.05.2018
12:57:24

Dmitrii
10.05.2018
12:57:49
Всем привет. Такой вопрос... А реально ли постгресовому RETURNING присобачить алиас для полей?
ORM требует для маппинга (по крайней мере для простого пути)

Denis
10.05.2018
12:58:09
вы спросили, кто-нибудь сталкивался. я сталкивался с вот таким, как описал.

Dmitrii
10.05.2018
12:59:06
Что тотипа RETURNING alias.id, ... ?

Alexandr
10.05.2018
12:59:07

Denis
10.05.2018
12:59:27
read-only на сессию, а не транзакцию.
полагаю, PostgreSQL возвращает одинаковую ошибку, даже если речь не о конкртеной транзакции.

Yaroslav
10.05.2018
13:02:37

Google

Yaroslav
10.05.2018
13:02:59

Alexandr
10.05.2018
13:11:23
Т.е. как вы это исключили?
я в коде разработчика посмотрел что он это не где не захардкодил, да и тот код работает уже пару недель без изменений и такой ошибки не было

Yaroslav
10.05.2018
13:14:29

Alexandr
10.05.2018
13:15:00
нашли косяк, чувак подключился через jetbrains в read-only режиме на порт баунсера

Darafei
10.05.2018
13:15:51
ух ты, у нас есть телепаты!

Alexandr
10.05.2018
13:16:11
всем спасибо

Yaroslav
10.05.2018
13:19:18

Dmitrii
10.05.2018
13:22:00
Так тоже оказывается можно )
Скажите, правильно ли будет решить следующую задачу через рекурсивные запросы. Если коротко то нужно генерировать номера для контр-агентов. Пример номера: 70468 где 7 это как бы "глобальный" неймспейс, "04" это закодированная буква D латинского алфавита, а 68 это просто 68 свободный в базе с такими же комбинациями на букву D в неймспейсе 7. Когда Последние две цифры переваливают за 99, то вместо 7 надо выбирать 8 и смотреть сколько контр-агентов под номером 04 и брать последнийсвободный саб-айди, например 01 если это первый контр-агентв неймспейсе 8. Т.е. его конечный id будет 80401

Vladislav
10.05.2018
15:48:43
банальный инкремент? о_0

Dmitrii
10.05.2018
15:48:50
Всего таких глобальных неймспейсов может быть три: 7, 8 и 9. Если ни в одном для него места нет — то выбрасываем ошибку

Vladislav
10.05.2018
15:48:54
какие-то странные сложности

Dmitrii
10.05.2018
15:49:23
Просто инкремент нельзя, перечитай еще раз ) Все это должен делать 1 SQL запрос )

Vladislav
10.05.2018
15:49:43
я прочитал "генерить"

Dmitrii
10.05.2018
15:49:43
И уметь переключать доступные неймспейсы среди 7, 8 и 9

Vladislav
10.05.2018
15:49:59
про селекты ни слова

Dmitrii
10.05.2018
15:50:06
Да, генерить, то максимальный id в группе 7 это 72699
Дальше 82699
И последний это 92699

Google

Vladislav
10.05.2018
15:51:04
три сиквенса со start и end

Dmitry
10.05.2018
15:52:40
Решал подобную задачу, в итоге делал в коде приложения

Dmitrii
10.05.2018
15:52:48
И как же мне перескакивать на неймспейс 8 если для буквы Z все занято?

Vladislav
10.05.2018
15:53:14
один сиквенс отвалится
а вообще да, бред такое в бд делать

Dmitrii
10.05.2018
15:53:36
Так он валиден для других букв )
Мне надо просто атомарно
Чтобы блокировками не обкладываться

Vladislav
10.05.2018
15:54:32
не стоит всякий бред на базу перекладывать, пускай это делает аппликейшен

Dmitrii
10.05.2018
15:55:00
Какая разница где "бред" лежит?

Vladislav
10.05.2018
15:55:15
большая

Dmitry
10.05.2018
15:55:20

Denis
10.05.2018
15:55:55
а непрерывность последовательности важна? тогда сиквенсы не подходят

Dmitrii
10.05.2018
15:56:08
Да, тут оно может быть непоследовательно
Это же контрагенты

Denis
10.05.2018
15:56:36
так допускаются пропуски или нет?

Dmitrii
10.05.2018
15:56:52
В пределах 701XX не допускаются
Остальное может скакать как попадет
По сути для комбинации первых трех чисел — два последних это некий сиквенс

Denis
10.05.2018
15:59:04
в общем, вы правы - это можно сделать подзапросами

Google

Dmitrii
10.05.2018
15:59:29
Без рекурсивных не обойтись? Или можно? Пока понять не могу
Именно вот этот "перескок" чтобы реализовать

Denis
10.05.2018
16:00:05
я не очень глубоко вдумывался, но не вижу предпосылок использовать рекурсивные.
перескок? ткните еще раз в него

Dmitrii
10.05.2018
16:00:53
70199 - последний id в базе для буквы A для неймспейса 7.
Добавляю еще длябуквы А. Будет поправилам — 80101
8(namespace)01(char position)01(seq)
A=01, B=02... Z=26

Vladislav
10.05.2018
16:02:22
вам проще сразу таблицу меппинга сделать наверно

Andrey
10.05.2018
16:02:25
А вот подскажите - pgbarman так и не научился сжимать base backup?
и если нет - какова формула подсчёта необходимого места на диске для его использования?

Dmitrii
10.05.2018
16:02:47

Andrey
10.05.2018
16:03:12
вводные: есть некоторое количество БД размером от 50GB до 1Tb.
хочется делать не менее 4 точек восстановления в день
ну и соотв. хранить промежуточные валы

Vladislav
10.05.2018
16:03:44

Andrey
10.05.2018
16:04:03
как корректно расчитать место на диске нужное под это хозяйство, а также что можно использовать чтобы сэкономить дисковое простарнство на бекап сервере?

Denis
10.05.2018
16:04:04
кажется, я бы делал так:
- сгенерировал бы серию generate_series для первого куска
- сджойнил бы с серией generate_series для второго куска
- нашел бы минимальное значение среди существующих с таким префиксом

Dmitrii
10.05.2018
16:05:16
В смысле вот так: SELECT * FROM generate_series(1, 26) AS g(gid), generate_series(1, 99) AS t(tid) ?
Получится около 7к строк как раз. Или еще часть с неймспейсом?

Google

Denis
10.05.2018
16:08:01
наоборот, наймспейс включить, а seq не генерировать

Dmitrii
10.05.2018
16:08:51
А

Denis
10.05.2018
16:09:32
дальше:
- найти минимальный свободный seq в каждом префиксе
- отсеять те, где seq = 99
- найти минимальный из оставшихся результатов
- увеличить в нем seq на единицу
- PROFIT

Dmitrii
10.05.2018
16:10:23
Щас буду пробовать. Спасибо за подгон )
И да, клянусь, эту накоманию не я придумал!

Denis
10.05.2018
16:10:57
вообще, че-то мы перемудрили.

Dmitrii
10.05.2018
16:11:25
Мне иногда кажется каждый раз, когда что-то касается бухгалтерии — начинается какой-то ад

Denis
10.05.2018
16:12:16
если можно пропускать номера, то берем сиквенс, от его значения просто арифметически высчитываем все составляющие
я правильно понял, что ваш номер - это XYZ, где X - от 7 до 9; Y - от 01 до 26; Z - от 0 до 99?

Dmitrii
10.05.2018
16:17:58

Denis
10.05.2018
16:18:00
X = 7 + n / 2600
Y = 1 + (n % 2600) / 100
Z = n % 100

Dmitrii
10.05.2018
16:18:24
Грузовик математиков подъехал?)

Denis
10.05.2018
16:18:33
n - текущее значение сиквенса

Dmitrii
10.05.2018
16:22:03
А, my bad. Я выше тоже не так подтвердил ?
1-99

Denis
10.05.2018
16:23:41
X = 7 + n / 2574
Y = 1 + (n % 2574) / 99
Z = 1 + n % 99

Dmitrii
10.05.2018
16:24:09
n % 99 + 1
Ну да )