如何在Ecto中更新时使用片段返回值

时间:2016-07-14 12:03:53

标签: elixir phoenix-framework ecto

我需要在数据库中执行更新并返回一个值。可以使用PostgreSQL

中的RETURNING关键字进行操作

由于ecto不支持,我想我必须使用fragment,但我不知道该怎么做。这就是我所拥有的:

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

我想在更新后返回一些字段,例如计数器和ID,因此我需要添加到查询中:RETURNING id, counter;

2 个答案:

答案 0 :(得分:2)

在Ecto 3中,对于update_all不建议使用return:true,而建议在查询中使用select。所以您可以像这样解决它:

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

答案 1 :(得分:1)

如果您使用Ecto.Repo.update_all https://hexdocs.pm/ecto/Ecto.Repo.html#c:update_all/3,则有一个选项:返回传递返回的字段列表   :returns - 选择要返回的字段。如果为true,则返回给定结构中的所有字段。可以是字段列表,其中仍返回结构但仅包含给定字段。或者false,没有返回任何内容(默认值)。所有数据库都不支持此选项。 执行后,您可以使用以下方法访问元组:   它返回一个元组,其中包含条目数和任何返回的结果作为第二个元素。如果数据库在UPDATE语句中不支持RETURNING或未选择返回结果,则第二个元素将为nil。 像这样的东西: result = from(v在MyModel中,其中:v.id == ^ instance_id)          |> MyRepo.update_all([inc:[counter:1]],返回:[id,counter])