Size: a a a

pgsql – PostgreSQL

2021 March 12

AN

Alexander Nikitin in pgsql – PostgreSQL
Ayan
в документации pg_repack не нашел такого ключа для форс
Значит изменила память :) не за компом сейчас
источник

D

Dmitriy in pgsql – PostgreSQL
Алексей
Ребят, заморочился со следующим вопросом. Я строю базу, периодически меняю названия столбцов. К этой базе другие пользователи делают запросы. Соответственно, если я поменяю названия столбца, то у них перестанут работать запросы. Хотелось бы, чтобы при переименовании столбца, переименовывались названия столбца в запросах пользователей. Какие то готовые решения есть для этого?
Значит, у вас антипаттерн "общая база".
источник

ac

alex che in pgsql – PostgreSQL
Алексей
Ребят, заморочился со следующим вопросом. Я строю базу, периодически меняю названия столбцов. К этой базе другие пользователи делают запросы. Соответственно, если я поменяю названия столбца, то у них перестанут работать запросы. Хотелось бы, чтобы при переименовании столбца, переименовывались названия столбца в запросах пользователей. Какие то готовые решения есть для этого?
Можно сделать View и запросы на чтение делать через них. Или функции-возвращающие-таблицы
источник

А

Алексей in pgsql – PostgreSQL
Dmitriy
Значит, у вас антипаттерн "общая база".
почему антипаттерн? ну есть архитекторы, админы базы. А есть юзеры. Юзеры пишут к базе запросы на выборку инфы. Если столбец таблицы в базе переименовывается, то нужно оповестить об этом юзеров, чтобы они отредактировали свои скрипты. А мне хочется, чтобы это автоматически происходило
источник

МШ

Михаил Шурутов... in pgsql – PostgreSQL
Ayan
как альтернативу VACUUM FULL для  pg_largeobject хотел попробовать
Для очень больших объектов используется утилита vacuumlo: https://postgrespro.ru/docs/postgresql/11/vacuumlo
источник

D

Dmitriy in pgsql – PostgreSQL
Алексей
почему антипаттерн? ну есть архитекторы, админы базы. А есть юзеры. Юзеры пишут к базе запросы на выборку инфы. Если столбец таблицы в базе переименовывается, то нужно оповестить об этом юзеров, чтобы они отредактировали свои скрипты. А мне хочется, чтобы это автоматически происходило
Я подумал, что у вас микросервисы просто, и оба ходят в одну базу. В любом случае готовой волшебной палочки нет, так что либо вьюхи делать, как уже выше написали, либо пересматривать сам подход к работе с базой данных
источник

AD

Artemiy Dubovoy in pgsql – PostgreSQL
Алексей
почему антипаттерн? ну есть архитекторы, админы базы. А есть юзеры. Юзеры пишут к базе запросы на выборку инфы. Если столбец таблицы в базе переименовывается, то нужно оповестить об этом юзеров, чтобы они отредактировали свои скрипты. А мне хочется, чтобы это автоматически происходило
Частая проблема, на самом деле. Тут дело не в архитектуре даже, а в том, что разработка не всегда бегает и рассказывает всем, что в базе что-то поменялось.

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

ДМ

Дмитрий Мачихелян... in pgsql – PostgreSQL
CREATE OR REPLACE FUNCTION public.find_customers_for_imitation(ids bigint[])

Почему ids не видит как параметр?
источник

AD

Artemiy Dubovoy in pgsql – PostgreSQL
Artemiy Dubovoy
Частая проблема, на самом деле. Тут дело не в архитектуре даже, а в том, что разработка не всегда бегает и рассказывает всем, что в базе что-то поменялось.

Я уже думал над решением такой задачи, пришла в голову относительно простая идея. Можно написать рутину, которая будет ходить в источник, забирать инфу об объектах, сверять с той, что нужна, затем в зависимости от критичности слать алерты ответственным лицам
В аналитике короче частая боль))
источник

А

Алексей in pgsql – PostgreSQL
источник

А

Алексей in pgsql – PostgreSQL
и для SQL SERVER
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Алексей
почему антипаттерн? ну есть архитекторы, админы базы. А есть юзеры. Юзеры пишут к базе запросы на выборку инфы. Если столбец таблицы в базе переименовывается, то нужно оповестить об этом юзеров, чтобы они отредактировали свои скрипты. А мне хочется, чтобы это автоматически происходило
В такой постановке задача же явно не имеет решения, нет?
Допустим, они хранят свои запросы в текстовых файлах... и что бы кто-то ни менял в базе, они же "магически" не изменятся. ;)
Поэтому на практике — либо views, либо functions, либо тестирование и т.д.
источник

ac

alex che in pgsql – PostgreSQL
В общем случае решения нет. Например, если поле уехало в отдельную таблицу-справочник, то робот не осилит поправить запрос
источник

AD

Artemiy Dubovoy in pgsql – PostgreSQL
Отдавать такие операции на откуп автоматике стрёмно, кмк. Лучше просто алертить
источник

А

Алексей in pgsql – PostgreSQL
Yaroslav Schekin
В такой постановке задача же явно не имеет решения, нет?
Допустим, они хранят свои запросы в текстовых файлах... и что бы кто-то ни менял в базе, они же "магически" не изменятся. ;)
Поэтому на практике — либо views, либо functions, либо тестирование и т.д.
я могу заставить их хранить все запросы в репозитории, нужно только чтобы при изменении структуры базы вносились изменения в скрипты
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Дмитрий Мачихелян
CREATE OR REPLACE FUNCTION public.find_customers_for_imitation(ids bigint[])

Почему ids не видит как параметр?
А почему Вы не показываете функцию и ошибку целиком?
источник

ac

alex che in pgsql – PostgreSQL
Или бывает, что после автопереименования получается ambiguous column name
источник

ДМ

Дмитрий Мачихелян... in pgsql – PostgreSQL
Yaroslav Schekin
А почему Вы не показываете функцию и ошибку целиком?
CREATE OR REPLACE FUNCTION public.find_customers_for_imitation(ids bigint[])
 RETURNS setof contacts_count
 LANGUAGE plpgsql
AS $function$
 begin
   create or replace view contacts_count as
   select contacts.user_id, count(contacts.user_id)
   from contacts
     where contacts.user_id = any(ids)
   group by contacts.user_id;
 END;
SQL
Error [42703]: ERROR: column "ids" does not exist
 Подсказка: Perhaps you meant to reference the column "contacts.id".
 Где: PL/pgSQL function find_customers_for_imitation(bigint[]) line 3 at SQL statement
 ERROR: column "ids" does not exist
 Подсказка: Perhaps you meant to reference the column "contacts.id".
 Где: PL/pgSQL function find_customers_for_imitation(bigint[]) line 3 at SQL statement
 ERROR: column "ids" does not exist
 Подсказка: Perhaps you meant to reference the column "contacts.id".
 Где: PL/pgSQL function find_customers_for_imitation(bigint[]) line 3 at SQL statement
источник

D

Dmitriy in pgsql – PostgreSQL
Алексей
я могу заставить их хранить все запросы в репозитории, нужно только чтобы при изменении структуры базы вносились изменения в скрипты
У вас же база изменяется через миграции? Вот добавьте туда какой-нибудь хук, который будет уведомлять тогда, когда новая миграция заезжает
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Дмитрий Мачихелян
CREATE OR REPLACE FUNCTION public.find_customers_for_imitation(ids bigint[])
 RETURNS setof contacts_count
 LANGUAGE plpgsql
AS $function$
 begin
   create or replace view contacts_count as
   select contacts.user_id, count(contacts.user_id)
   from contacts
     where contacts.user_id = any(ids)
   group by contacts.user_id;
 END;
SQL
Error [42703]: ERROR: column "ids" does not exist
 Подсказка: Perhaps you meant to reference the column "contacts.id".
 Где: PL/pgSQL function find_customers_for_imitation(bigint[]) line 3 at SQL statement
 ERROR: column "ids" does not exist
 Подсказка: Perhaps you meant to reference the column "contacts.id".
 Где: PL/pgSQL function find_customers_for_imitation(bigint[]) line 3 at SQL statement
 ERROR: column "ids" does not exist
 Подсказка: Perhaps you meant to reference the column "contacts.id".
 Где: PL/pgSQL function find_customers_for_imitation(bigint[]) line 3 at SQL statement
Потому что CREATE не параметризуются в принципе (а вообще функция выглядит как-то очень странно — зачем view пересоздавать при каждом вызове, что это вообще за подход?!).
Я даже не хочу подсказывать, как тут дальше выстрелить себе в ногу, если честно. ;(
источник