如何模式匹配Ecto查询错误

时间:2015-04-11 17:21:01

标签: elixir ecto

与elixir中的其他函数(以及Ecto自己的事务)一样,我想模式匹配以处理Ecto查询的潜在错误。像这样:

case Repo.get!(User, id) do
  {:ok, user} ->
    #do something
  {:error, message} ->
    #pass the error
end

显然这不起作用,但我如何模式匹配Ecto错误,如Ecto.NotSingleResult和其他潜在的查询问题,如预加载错误?

3 个答案:

答案 0 :(得分:2)

使用Repo.get将返回值或nil。然后,您可以在预期的结构上进行模式匹配或使用if子句。 Repo.get!故意提出(对于你希望结构存在的情况并且不存在错误)。

答案 1 :(得分:0)

嘿,我对elixir有点新意,但我认为你可以在这里使用护卫条款

case Repo.get!(User, id) do
  {:ok, user} ->
    #do something
  {:error, message} when :error === Ecto.NotSingleResult ->
    #pass the error
end

答案 2 :(得分:0)

这可能会成功

case Repo.get(User, id) do
  user when is_map(user) -> {:ok, user}
  nil -> {:error, "not found"}
end

对此Elixir, Ecto pattern matching conditional with db query not behaving as expected

的反应