7

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

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

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

4

3 回答 3

2

使用Repo.getwhich 将返回一个值或 nil。然后,您可以对预期的结构进行模式匹配或使用 if 子句。Repo.get!故意引发(对于您希望结构存在但不存在的情况是错误的)。

于 2015-04-11T20:11:58.760 回答
1

这可能会奏效

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

参考这个Elixir,Ecto 模式匹配条件与 db 查询的行为不符合预期

于 2018-01-04T12:03:06.783 回答
0

嘿,我对长生不老药有点新,但我认为你可以在这里使用保护条款

case Repo.get!(User, id) do
  {:ok, user} ->
    #do something
  {:error, message} when :error === Ecto.NotSingleResult ->
    #pass the error
end
于 2015-04-11T17:42:38.180 回答