我在postgresql中有一个表,我想用一个随机数更新所有记录的“points”列的值。在其他语言中,我们可以循环遍历所有的数据库记录,但如何用ecto来实现呢?我尝试了以下方法:
Repo.all(from u in User, update: User.changeset(u, %{points: :rand.uniform(100)}))
但它输出以下错误:
== Compilation error in file lib/hello_remote/user.ex ==
** (Ecto.Query.CompileError) malformed update `User.changeset(u, %{points: :rand.uniform(100)})` in query expression, expected a keyword list with set/push/pop as keys with field-value pairs as values
expanding macro: Ecto.Query.update/3
lib/hello_remote/user.ex:30: HelloRemote.User.update_points/0
expanding macro: Ecto.Query.from/2
lib/hello_remote/user.ex:30: HelloRemote.User.update_points/0
(elixir 1.10.4) lib/kernel/parallel_compiler.ex:304: anonymous fn/4 in Kernel.ParallelCompiler.spawn_workers/7
我也试过这个:
from(u in User)
|> Repo.update_all(set: [points: Enum.random(0..100)])
但它会使用相同的值更新所有记录
2条答案
按热度按时间n7taea2i1#
可以将fragment/1与update_all/3配合使用,调用PostgreSQL函数来计算随机值,例如:
fnatzsnv2#
我认为
update_all
函数不可能做到这一点。创建该函数是为了用相同的值更新多行。你可以创建一个循环,并分别更新每个记录,这不是很好,但一个工作的解决方案。
如果你想一次调用就完成,你可以构造一个原始的SQL查询并使用它。