如何解决Ecto:如何使用不同的随机数更新所有记录
我在postgresql中有一个表,我想为具有随机数的所有记录更新“点”列的值。在其他语言中,我们可以遍历所有数据库记录,但是我该如何使用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)])
但它会更新具有相同值的所有记录
解决方法
您可以将fragment/1与update_all/3一起使用,调用PostgreSQL函数来计算随机值,例如:
update(User,set: [points: fragment("floor(random()*100)")])
|> Repo.update_all([])
,
我认为update_all
功能是不可能的。创建该函数是为了更新具有相同值的许多行。
您可以创建一个循环并分别更新每条记录,这不是很好,但是可行的解决方案。
User
|> Repo.all()
|> Enum.each(fn user -> update_user(user) end)
def update_user(user) do
user
|> Ecto.Changeset.cast(%{"points" => Enum.random(0..100)},[:points])
|> Repo.update!()
end
如果您希望一次调用就可以构造一个原始SQL查询并使用它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。