Ecto - update_all错误期间返回值的格式

时间:2017-04-28 20:31:03

标签: phoenix-framework ecto

使用Ecto的update_all更新所有匹配的记录时,错误情况下返回值的格式是什么?文档对于期待什么有点模糊 - '它返回一个包含条目数和任何返回结果作为第二元素的元组。'

例如,假设有10条匹配的记录,无论出于何种原因,其中2条记录的update操作失败。我的假设是返回的值看起来像这样:

{8, [{:error, error info}, {:error, error info}]}

这是对的吗?这些错误会作为元组列表返回吗?

1 个答案:

答案 0 :(得分:1)

不,如果UPDATE查询失败,Repo.update_all会抛出错误。如果发生这种情况,数据库中实际上没有保存任何更改。

返回元组的第二个元素中的列表是您使用RETURNING子句要求查询返回的数据,例如: query |> Repo.update_all([], returning: [:id])只返回已填充id字段的更新结构,returning: true将返回填充了所有字段的结构。

以下是更新查询的一条记录中发生错误的示例:

iex(1)> from(p in Post, select: p.id) |> Repo.all
[debug] QUERY OK source="posts" db=1.1ms queue=0.1ms
SELECT p0."id" FROM "posts" AS p0 []
[1, 2, 3]

iex(2)> from(p in Post, where: p.id in [2, 3], update: [set: [id: fragment("CASE WHEN ? = 3 THEN 1 ELSE ? END", p.id, p.id)]]) |> Repo.update_all([])
** (Postgrex.Error) ERROR 23505 (unique_violation): duplicate key value violates unique constraint "posts_pkey"

    table: posts
    constraint: posts_pkey

Key (id)=(1) already exists.
[debug] QUERY ERROR source="posts" db=4.8ms
UPDATE "posts" AS p0 SET "id" = CASE WHEN p0."id" = 3 THEN 1 ELSE p0."id" END WHERE (p0."id" IN (2,3)) []
    (ecto) lib/ecto/adapters/sql.ex:436: Ecto.Adapters.SQL.execute_and_cache/7