像 elixir 中的其他函数(以及 Ecto 自己的事务)一样,我想通过模式匹配来处理 Ecto 查询的潜在错误。像这样:
case Repo.get!(User, id) do
{:ok, user} ->
#do something
{:error, message} ->
#pass the error
end
显然这不起作用,但我怎样才能模式匹配 Ecto 错误,如 Ecto.NotSingleResult 和其他潜在的查询问题,如预加载错误?
使用Repo.get
which 将返回一个值或 nil。然后,您可以对预期的结构进行模式匹配或使用 if 子句。Repo.get!
故意引发(对于您希望结构存在但不存在的情况是错误的)。
这可能会奏效
case Repo.get(User, id) do
user when is_map(user) -> {:ok, user}
nil -> {:error, "not found"}
end
嘿,我对长生不老药有点新,但我认为你可以在这里使用保护条款
case Repo.get!(User, id) do
{:ok, user} ->
#do something
{:error, message} when :error === Ecto.NotSingleResult ->
#pass the error
end