如何模式匹配 Ecto 查询错误

How to pattern match Ecto query error

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

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

显然这行不通,但我如何才能模式匹配 Ecto.NotSingleResult 等 Ecto 错误和预加载错误等其他潜在查询问题?

嘿,我对 elixir 有点陌生,但我认为你可以在这里使用保护子句

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

使用 Repo.get 这将 return 一个值或零。然后,您可以在预期的结构上进行模式匹配或使用 if 子句。 Repo.get! 故意加注(对于你期望结构存在但不存在的情况是错误的)。

这可能会成功

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

参考此 Elixir,Ecto 模式匹配条件与数据库查询不符合预期