从记录集中获取单个记录

use*_*648 3 elixir ecto phoenix-framework

简单请求:

    a1 = where(MyModel, [x], is_nil(x.some_foreign_id)) |> Repo.one()
Run Code Online (Sandbox Code Playgroud)

例外:

** (exit) an exception was raised:                                
    ** (Ecto.MultipleResultsError) expected at most one result but got 6 in query:
Run Code Online (Sandbox Code Playgroud)

是的,有一些记录,没关系,但我的目的是拿第一个。为什么出现异常以及如何修复它?

Dog*_*ert 5

为什么异常

Repo.one总是返回 nil 或一条记录,如果程序员limit自己将 加入到查询中,而不是从数据库中获取更多记录,然后抛出除一条之外的所有记录,那就更好了。

如何解决?

您可以使用limit(1)

a1 = where(MyModel, [x], is_nil(x.some_foreign_id)) |> limit(1) |> Repo.one()
Run Code Online (Sandbox Code Playgroud)

请注意,如果没有order,返回的记录在大多数数据库中通常是未定义的。您可以订购id以获取最低的记录id

a1 = where(MyModel, [x], is_nil(x.some_foreign_id)) |> order_by(:id) |> limit(1) |> Repo.one()
Run Code Online (Sandbox Code Playgroud)