从 Ecto 数据库中获取随机记录
Fetch random records from Ecto database
是否可以仅使用纯 Ecto 查询而不是在应用程序端从数据库中获取 10 条随机记录?例如,我不想从数据库中获取所有记录,然后在 Elixir 中从中获取随机值(像这样):
Subscribers
|> Repo.all
|> Enum.take_random(10)
Ecto 不提供用于检索记录的通用 random
函数,因为底层 databases/schemas 可以( 和 do)以非常不同的方式实现它方式。
但是如果你知道你正在处理的是什么数据库,你可以使用fragment/1
and limit/3
to achieve that. For postgresql, you can use them with the RANDOM()
函数:
import Ecto.Query
query =
from Subscribers,
order_by: fragment("RANDOM()"),
limit: 10
Repo.all(query)
这相当于调用此 sql
查询:
SELECT * FROM subscribers ORDER BY RANDOM() LIMIT 10
我发现这个问题是为了弄清楚如何获取一个零 parent_task 属性.
的单个随机记录
我想我会 post 我的解决方案,以防它对任何人有帮助。
解决方案 1
如果有人知道如何避免 List.first 并且只使用 Ecto 查询,我将不胜感激!
query =
from t in Subscriber,
where: is_nil(t.parent_task),
order_by: fragment("RANDOM()"),
limit: 1
Repo.all(query) |> List.first
解决方案 2
Repo.all(Subscriber) |> Enum.filter(fn x -> is_nil(x.parent_task) end) |> Enum.random()
是否可以仅使用纯 Ecto 查询而不是在应用程序端从数据库中获取 10 条随机记录?例如,我不想从数据库中获取所有记录,然后在 Elixir 中从中获取随机值(像这样):
Subscribers
|> Repo.all
|> Enum.take_random(10)
Ecto 不提供用于检索记录的通用 random
函数,因为底层 databases/schemas 可以( 和 do)以非常不同的方式实现它方式。
但是如果你知道你正在处理的是什么数据库,你可以使用fragment/1
and limit/3
to achieve that. For postgresql, you can use them with the RANDOM()
函数:
import Ecto.Query
query =
from Subscribers,
order_by: fragment("RANDOM()"),
limit: 10
Repo.all(query)
这相当于调用此 sql
查询:
SELECT * FROM subscribers ORDER BY RANDOM() LIMIT 10
我发现这个问题是为了弄清楚如何获取一个零 parent_task 属性.
的单个随机记录我想我会 post 我的解决方案,以防它对任何人有帮助。
解决方案 1
如果有人知道如何避免 List.first 并且只使用 Ecto 查询,我将不胜感激!
query =
from t in Subscriber,
where: is_nil(t.parent_task),
order_by: fragment("RANDOM()"),
limit: 1
Repo.all(query) |> List.first
解决方案 2
Repo.all(Subscriber) |> Enum.filter(fn x -> is_nil(x.parent_task) end) |> Enum.random()