【发布时间】:2018-08-08 17:23:46
【问题描述】:
基于 Elixir thread from last year,我能够编写一个原始 SQL 查询来使用不相关表中的值批量更新记录。但是,我希望能够使用 Ecto 生成此查询。
在下面的例子中,假设有两个表,cats 和 dogs,cats 表有一个外键(dog_id)。我想把狗和猫联系起来。
下面的代码是我如何使用 Elixir 和原始 SQL 手动执行此操作的:
cat_ids = [1,2,3] # pretend these are uuids
dog_ids = [4,5,6] # ... uuids
values =
cat_ids
|> Enum.zip(dog_ids)
|> Enum.map(fn {cat_id, dog_id} ->
"('#{cat_id}'::uuid, '#{dog_id}'::uuid)"
end)
|> Enum.join(", ")
sql = """
UPDATE cats as a
SET dog_id = c.dog_id
from (values #{values}) as c(cat_id, dog_id)
where c.cat_id = a.id;
"""
Repo.query(sql)
有没有办法把它移到 Repo.update_all 或使用一些片段,这样我就不用手动构建查询了?
【问题讨论】:
标签: postgresql elixir ecto