@pgsql

Страница 1026 из 1062
Terminator
08.10.2018
19:10:28
@Frank_Einstein будет жить. Поприветствуем!

@floyernick будет жить. Поприветствуем!

@SergiiDovgal будет жить. Поприветствуем!

@nnch90 будет жить. Поприветствуем!

Google
Dmitriy
09.10.2018
05:49:44
Господа, а подскажите, где сейчас эффективней хантить специалистов по PostgreSQL? Ищем инженеров и внедренцев, hh.ru приводит в основном только ораклистов(

Pgconf в прошлом году тоже результатов не дал, увы

Gennady
09.10.2018
06:00:25
Ораклистов переучивать нормально, проверено

??Suffer
09.10.2018
06:06:24
GRANT and REVOKE are not allowed on untrusted languages, because only superusers can use untrusted languages.

и что делать?

мне надо пользователю дать

Terminator
09.10.2018
06:08:36
Арсений Судариков будет жить. Поприветствуем!

Арсений
09.10.2018
06:09:08
Сразу чувствую прогерский чат. Сразу роботы нападают

X
09.10.2018
06:38:50
Да прибудет с тобой жизнь!

Yaroslav
09.10.2018
06:42:31
мне надо пользователю дать
Нет, не надо. Т.к. Вы этим ему даёте фактически права superuser, по идее.

Dmitriy
09.10.2018
06:47:36
и что делать?
UPDATE pg_language SET lanpltrusted = true WHERE lanname = 'plpythonu';Думаю, не надо объяснять все риски этой затеи - пользователь потом сможет сделать rm -rf /*

Google
Sergey
09.10.2018
06:54:31
В 10м постгре можно сделать upsert на exclude constraint?

Yaroslav
09.10.2018
07:07:40
В 10м постгре можно сделать upsert на exclude constraint?
"Note that exclusion constraints are not supported as arbiters with ON CONFLICT DO UPDATE"

Sergey
09.10.2018
07:08:26
Значит ничего не поменялось, спасибо.

Vitaliy
09.10.2018
07:49:18
Доброго времени суток! Буду благодарен, если подскажите, как правильно написать SQL запрос с условием, в формате: Если версия PG меньше 10 выполни такой запрос, если 10 и более тогда другой.

Попробовал вот так, не работает:

select case when (select (current_setting('server_version_num'))::int) < 100000 then (select count(*) from pg_stat_activity where waiting) else (select count(*) from pg_stat_activity where wait_event_type in ('LWLock', 'Lock', 'BufferPin') and backend_type = 'client backend') end;

Sergey
09.10.2018
07:55:53
Я так понимаю колонки wait_event_type в 9.х нету

Поэтому надо разделить два запроса

Yaroslav
09.10.2018
07:56:55
Попробовал вот так, не работает:
Эээ... никак, наверное (тут нужны отдельные запросы), т.к. сама структура relation отличается.

Vitaliy
09.10.2018
07:57:32
Думал на крайний случай так реализовать метрику, но хотелось красиво, в рамках одного запроса)

Ну ладно, нашлёпаю под 10-ку отдельно. Спасибо.

Mike Chuguniy
09.10.2018
08:00:55
Ну ладно, нашлёпаю под 10-ку отдельно. Спасибо.
Чтобы Вам веселее жЫлось на свете, настоятельно рекомендую заглянуть в доку по 9.6: https://postgrespro.ru/docs/postgresql/9.6/monitoring-stats#pg-stat-activity-view

Vitaliy
09.10.2018
08:03:58
Мне уже весело, спасибо . Скорее , это недопонимание работы case, думал что не будет выполняться запрос после else , если уже выполнено условие запрос после then.

Vitaliy
09.10.2018
08:08:06
Да, уже дошло, спасибо .

??Suffer
09.10.2018
08:33:14
https://explain.depesz.com/s/Mwqw

https://explain.depesz.com/s/PI1O

https://dumpz.org/a57bAGwp3bTB

Такой запрос оптимальный?

Я пытаюсь искать по тексту тегов с кастомным стеммером

Google
Alexey
09.10.2018
08:58:58
Подскажите, какой use case оптимистических блокировок. Между тем, как проверил данные и пошёл что-то обновлять, данные, которые проверил, могли измениться. Соотвественно есть непонимание использования этого подхода.

Alexey
09.10.2018
09:02:55
Если изменились, Вы их не обновляете (выдаёте ошибку / делаете что-то ещё, например, начинаете с начала), вот и всё.
Ну вот я ж написал, что если данные не изменились, то пошёл их обновлять. И между тем, как я делал проверку и пошёл обновлять, было изменение этих данных.

Yaroslav
09.10.2018
09:03:43
> И между тем, как я делал проверку и пошёл обновлять, было изменение этих данных. Ещё раз: "в таком случае, Вы их не обновляете (выдаёте ошибку / делаете что-то ещё, например, начинаете с начала), вот и всё."

Alexey
09.10.2018
09:07:53
Оу, т.е. обновление и check в одном запросе, хорошо. Вот тут читаю документацию: https://www.doctrine-project.org/projects/doctrine-orm/en/latest/reference/transactions-and-concurrency.html Выглядит так, что у них это 2 разных запроса.

Если убрать ORM, то в сыром запросе версией может служить xmin?

Yaroslav
09.10.2018
09:13:56
Если убрать ORM, то в сыром запросе версией может служить xmin?
> Оу, т.е. обновление и check в одном запросе, хорошо. Ну вот у них написано: In this approach any entity that should be protected against concurrent modifications during long-running business transactions gets a version field that is either a simple number (mapping type: integer) or a timestamp (mapping type: datetime). When changes to such an entity are persisted at the end of a long-running conversation the version of the entity is compared to the version in the database and if they don't match, an OptimisticLockException is thrown, indicating that the entity has been modified by someone else already. > Если убрать ORM, то в сыром запросе версией может служить xmin? Я бы Вам не советовал использовать системные поля с такими целями... Зачем на internals завязываться?

Yaroslav
09.10.2018
09:33:38
> А вот про сравнение версий я вас понял, но до конца не понял, кто эти версии должен сравнить, я или ORM. Вроде же там написано, что ORM делает это за Вас? Даже вон exception (OptimisticLockException) "придумывает". Вы понимаете, как это на "низком уровне" работает?

Alexey
09.10.2018
09:35:02
Да, но там пример использования какой? там find и lock... как бы я не уверен, что если я потом пойду изменять данные, то мне кто-то кинет exception.

> Вы понимаете, как это на "низком уровне" работает Там же поле version добалили. Вот с ним, по всей видимости, и сравнивают.

Yaroslav
09.10.2018
09:36:15
Да, но там пример использования какой? там find и lock... как бы я не уверен, что если я потом пойду изменять данные, то мне кто-то кинет exception.
Проверьте, это же несложно. "Кем-то" в данном случае может быть только ORM, т.к. для сервера (PostgreSQL) это вообще не ошибка.

Alexey
09.10.2018
09:37:19
Окей, я просто попробую

Yaroslav
09.10.2018
09:48:34
> Вы понимаете, как это на "низком уровне" работает Там же поле version добалили. Вот с ним, по всей видимости, и сравнивают.
Смотрите, это работает так: . В таблице создаётся поле version, которое будет обновляться (получая новое уникальное значение) при каждом UPDATE. Это может достигаться: . Явным: "UPDATE table SET updated_field = 'lala', <version = new_version> ...". То, что в <>, добавляет ORM. . Триггером на UPDATE в базе данных (который делает по сути то же самое SET version = new_version). Т.к. new_version д/б уникальным, для этого часто используют sequence (ну или timestamp, что, теоретически, менее надёжно). Далее, когда клиент использует optimistic locking, он делает так: . <первая тразакция> "SELECT ..., version FROM table WHERE id = $1;" и запоминает прочитанную version. . <вторая транзакция (может быть хоть 5-ю днями позже ;) > UPDATE table SET some_col = 'new_col_value', version = <new_version> WHERE id = <id из первой транзакции> AND version = <запомненная тогда version>; Если UPDATE выполнен без ошибок, тут два возможных исхода : UPDATE 1 — считаем, что всё хорошо. UPDATE 0 — ясно, что за прошедшее с первой транзакции время кто-то изменил запись — обрабатываем как ошибку в клиенте (например, throw exception OptimisticLockException).

Alexey
09.10.2018
09:51:02
Ага, вот только что, если я укажу версию и следом сделаю два update-а

Yaroslav
09.10.2018
09:53:38
Alexey
09.10.2018
09:56:11
Yaroslav, спасибо. Я уже узнал то, что нужно: как работает optimistic lock. Далее на все вопросы я смогу сам ответить.

Vlad
09.10.2018
09:57:16
Добрый день всем. Есть ли у кого русская документация по sequelize.js? #sequelize

Google
juriy
09.10.2018
10:06:29
Господа, а нету ли возможности добавлять в композитный тип функцию? Чтобы было похоже на ООП?

Konstantin
09.10.2018
10:10:54
Господа, а нету ли возможности добавлять в композитный тип функцию? Чтобы было похоже на ООП?
можно определить функцию, которая принимает в качестве аргумента композитный тип. Полиморфизм у Постгреса есть.

juriy
09.10.2018
10:14:23
можно определить функцию, которая принимает в качестве аргумента композитный тип. Полиморфизм у Постгреса есть.
Нет, не так)) Я хочу чтобы функция была членом композитного типа, и строка этого типа являла собой "объект ООП": declare my_var my_schema.my_composite_type; ... select ... from ... into my_var; ... и наконец my_var.some_func(); my_var.column1 := 123; my_var.some_other_func('paramvalue123');

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

Вот щас подумал... А ведь можно же перегрузку операторов сделать... Объявить свой тип, задать ему оператор для вызова функции (точнее уже - метода), и вызывать этот "метод" подсовывая туда колонку в качестве this... Интересно, кто-нибудь так делал? Ушёл ковырять, если кто-нибудь так делал, очень рад буду если поделитесь опытом))

Terminator
09.10.2018
10:42:32
@feelosophy будет жить. Поприветствуем!

Yaroslav
09.10.2018
10:51:50
Возможно выглядит как изврат, но проект довольно сложный, логики много, и в процедурном стиле я боюсь просто каша получится в итоге
> Возможно выглядит как изврат Вот-вот, IMHO. > и в процедурном стиле я боюсь просто каша получится в итоге А уж в этом-то стиле бояться нечего (т.е. наверняка получится). ;) > Ушёл ковырять, если кто-нибудь так делал, очень рад буду если поделитесь опытом)) Вы уверены, что на это в самом деле лучше? Попробовать-то можно... но стоит ли?

juriy
09.10.2018
11:13:56
> Возможно выглядит как изврат Вот-вот, IMHO. > и в процедурном стиле я боюсь просто каша получится в итоге А уж в этом-то стиле бояться нечего (т.е. наверняка получится). ;) > Ушёл ковырять, если кто-нибудь так делал, очень рад буду если поделитесь опытом)) Вы уверены, что на это в самом деле лучше? Попробовать-то можно... но стоит ли?
Вот почитал щас доку к операторам, выглядит действительно не очень подходяще... Просто опыта в Постгресе всего с месяц. » А уж в этом-то стиле бояться нечего (т.е. наверняка получится) Мне бы как-нибудь чтобы можно было инкапсулировать части системы... schemas не до конца решают это дело, точнее они тоже немножко для другого... Вот вчера наткнулся на вложенные блоки с возможностью объявлять локальные переменные внутри них, попробую от этого плясать, если нужно заизолировать кусок функционала...

Konstantin
09.10.2018
11:14:25
Возможно выглядит как изврат, но проект довольно сложный, логики много, и в процедурном стиле я боюсь просто каша получится в итоге
Ну честно говоря большой разницы в obj.foo() и foo(obj) я не вижу. ИМХО не в этом суть объектного подхода. Вот то, что в Посгресе не работает динамический полиморфизм - это проблемка. Т.е. вы не сможете создать таблицу Stuff с выведенными таблицами Employee и Contractor и опеределить метод (функцию) salary по разному для Employee и Contractor, так чтобы можно было сделать запрос по Stuff и в зависимости от экземпляра позвался бы нужный метод

Bogdan
09.10.2018
11:36:36
Добрый день, знатоки функций, подскажите, какая функция будет быстрее работать https://pastebin.com/qZEMv6Yj 4 варианта, 3 sql и последний plpgsql (функция TS_HEADLINE — STABLE ) второй вариант кажется самым читабельным, но сможет ли постгре выполнить быстро where для функции со скалярным результатом как я понимаю, самы быйстрой 3й вариант (при условии что postgresql не вызовет TS_HEADLINE дважды, хотя не должен)

juriy
09.10.2018
11:36:59
Ну честно говоря большой разницы в obj.foo() и foo(obj) я не вижу. ИМХО не в этом суть объектного подхода. Вот то, что в Посгресе не работает динамический полиморфизм - это проблемка. Т.е. вы не сможете создать таблицу Stuff с выведенными таблицами Employee и Contractor и опеределить метод (функцию) salary по разному для Employee и Contractor, так чтобы можно было сделать запрос по Stuff и в зависимости от экземпляра позвался бы нужный метод
Согласен, похоже мой мозг просто ищет, как применить ООП шаблоны, ибо привык исключительно к ним) » чтобы можно было сделать запрос по Stuff и в зависимости от экземпляра позвался бы нужный метод Ага, понял... Любопытная задача, но в итоге это ведь можно решить, просто "обвес" не очень красивый нужно будет пилить? (например, в "родительской" функции вызывать одну из "дочерних")

Mikhail
09.10.2018
11:41:45
> create table t (a int); > insert into t select 1; > select t.hstore from t; hstore ---------- "a"=>"1"

juriy

вот такие еще отголоски прошлого работают

но это всё кажется не самым удобным в общем виде

но для всяких конкретных небольших задач -- может быть компактно и красиво описано

но надо вводить свои супер функции скорее всего

juriy
09.10.2018
11:49:42
но надо вводить свои супер функции скорее всего
Супер функция это как? Не такая, где много вложенных блоков begin...end со своими переменными и т.д.?

Mikhail
09.10.2018
11:52:24
я про метафункцию скорее в этом смысле. но можно возможно и без этого обойтись

Google
Mikhail
09.10.2018
11:52:53
> create table t (a int); > insert into t select 1; > select t.hstore from t; hstore ---------- "a"=>"1"
вот это кстати отличный прмер, чтобы понять как оно вообще работает

всем рекомендую

juriy
09.10.2018
11:55:49
вот это кстати отличный прмер, чтобы понять как оно вообще работает
тогда просьба чуть-чуть разжевать, потому что если честно, не понял сути - этот пример относится к реализации динамического полиморфизма?

Mikhail
09.10.2018
11:56:01
да

у вас появился "метод" hstore у типа

juriy
09.10.2018
11:57:28
у вас появился "метод" hstore у типа
а как ему передать параметры?

Страница 1026 из 1062