Как использовать фрагмент для возврата значения при обновлении в Ecto

Мне нужно выполнить обновление в базе данных и вернуть значение. Это возможно с помощью ключевого слова RETURNING в PostgreSQL.

Поскольку это не поддерживается экто, я думаю, мне нужно использовать фрагмент но я не уверен, как это сделать. Вот что у меня есть:

query = from(v in MyModel, 
 where: v.id == ^instance_id, 
 update: [
   inc: [counter: 1], 
 ]
)

Я хотел бы вернуть некоторые поля после обновления, например счетчик и идентификатор, поэтому мне нужно добавить в запрос: RETURNING id, counter;


person Adrian Ribao    schedule 14.07.2016    source источник


Ответы (2)


Если вы используете Ecto.Repo.update_all https://hexdocs.pm/ecto/Ecto.Repo.html#c:update_all/3 есть вариант :возврат к проходу с возвращаемым списком полей

:returning — выбирает, какие поля возвращать. Когда true, возвращает все поля в данной структуре. Может быть списком полей, где структура по-прежнему возвращается, но только с заданными полями. Или false, когда ничего не возвращается (по умолчанию). Этот параметр поддерживается не всеми базами данных.

И после выполнения вы можете получить доступ к кортежу следующим образом:

Он возвращает кортеж, содержащий количество записей и любой возвращенный результат в качестве второго элемента. Если база данных не поддерживает RETURNING в операторах UPDATE или не выбран результат возврата, второй элемент будет нулевым.

Что-то вроде этого:

result = from(v in MyModel, where: v.id == ^instance_id)
         |> MyRepo.update_all([inc: [counter: 1]], returning: [id, counter])
person neydroid    schedule 14.07.2016
comment
Благодарю вас! это прекрасно работает. Мне просто нужно было заменить MyRepo.update_all на Repo.update_all - person Adrian Ribao; 14.07.2016

В Ecto 3 возможность использовать return: true устарела для update_all в пользу выбора в запросе. Итак, вы бы решили это так:

result = from(v in MyModel, where: v.id == ^instance_id, select: {v.id, v.counter})
         |> MyRepo.update_all([inc: [counter: 1]])
person Stoecki    schedule 16.01.2019