从Ecto数据库中获取随机记录

Dye*_*517 2 postgresql elixir ecto

是否可以仅使用纯Ecto查询从数据库中获取10个随机记录,而不是在应用程序端?例如,我不想从数据库中获取所有记录,然后在Elixir中获取它们的随机值(如下所示):

Subscribers
|> Repo.all
|> Enum.take_random(10)
Run Code Online (Sandbox Code Playgroud)

She*_*yar 7

Ecto不提供random用于检索记录的通用函数,因为底层数据库/模式可以(并且确实)以非常不同的方式实现它.

但是如果你知道你正在处理什么数据库,你可以使用fragment/1limit/3实现这一点.对于,您可以将它们与RANDOM()函数一起使用:

query =
  from Subscribers,
  order_by: fragment("RANDOM()"),
  limit: 10

Repo.all(query)
Run Code Online (Sandbox Code Playgroud)

这相当于调用此sql查询:

SELECT * FROM subscribers ORDER BY RANDOM() LIMIT 10
Run Code Online (Sandbox Code Playgroud)