微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Ecto的连接查询中更新两个表中具有相同名称的列

如何解决如何在Ecto的连接查询中更新两个表中具有相同名称的列

所以 Ecto 中有 update_all 方法,据我所知,我们可以向其传递连接查询。但后来我意识到我有一个同名的列,这导致了应该更新哪个列的歧义。

Repo.update_all(
  from(d in "dogs",inner_join: b in "bones",on: b.dog_id == d.id,where: d.status != "new",where: b.status != "new",update: [set: [status: "excellent"]]
  ),[]
)

这导致表 status 中的列 dogs 被更新,然后我如何更新 bones 表中的列?

解决方法

就其性质而言,update_all 将更新 from 子句中的表。如果要更新多个表,则需要使用 Ecto.Multi

,

可能有一种方法可以完全使用 SQL 来做到这一点,但我们希望 Ecto 能够让事情变得更简单,对吧?

所以,首先,对表使用字符串是可以接受的,但您确实需要知道自己在做什么。您基本上绕过了 Ecto 为您设置的与数据库交互的所有内容。 通常,您需要的是 Dog 的模式和 Bone 的模式。 Please refer to the excellent Ecto documentation.

然后我们有 Ecto.Multi,它基本上收集了一堆数据库交互,然后在一个事务中执行所有内容。 Please look at the Ecto.Multi docs as wellpay special attention to Ecto.Multi.update_all/5

例如:

dog_query = from(
  dogs in Dog,dogs.status != "new"
)

bone_query =  from(
  bones in Bone,bones.status != "new"
)

Ecto.Multi.new()
|> Ecto.Multi.update_all(:dogs,dog_query,set: [status: "new"])
|> Ecto.Multi.update_all(:bones,bone_query,set: [status: "new"])
|> Repo.transaction()

# I think this returns {:ok,%{dogs: [_all_updated_dogs],bones: [_all_updated_bones]}}

这将在一个事务中执行两个更新,这意味着在更新 dog 和 bone 时不能更改行(使用数据库锁和事务。)

您可以使用任何类型的 queryable 运行 multis,因此如果您坚持直接使用表名,您可以继续将 Dog 替换为 "dogs",但我建议使用架构来阐明您的架构。

编辑:还有我的一个宠物,请在你的 ecto 查询中使用全名 - d b 看起来很相似......想象一个带有 b {{ 的大查询1}} ddb 等,这代表什么?哦!请命名您的变量。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。