go-pg/pg如何实现PostgreSQL两表关联的UPDATE更新查询
问题根因
你之前的代码无法生效,核心原因是go-pg/pg的Join()、JoinOn()方法仅为SELECT查询场景设计,PostgreSQL多表关联更新使用的是UPDATE ... FROM语法,不属于JOIN逻辑范畴,直接调用Join方法无法生成你需要的关联子句。
正确实现代码
go-pg中为UPDATE语句追加关联表,需要使用Table()方法指定FROM子句后的关联表,关联条件直接写在Where块中即可,代码如下:
_, err := c.postgresDB.WithContext(ctx). Model(&Product{}). // 传入模型实例指针,不要直接传结构体类型 Set("price = ?", 200). Table("product_segment AS ps"). // 对应原生SQL中FROM后的关联表声明 Where("product.segment_id = ps.id"). // 两表关联匹配条件 Where("product.name = ?", "diam"). // 业务过滤条件 Update()
生成SQL校验
上述代码最终生成的原生SQL和你的预期逻辑完全一致:
UPDATE product AS product SET price = 200 FROM product_segment AS ps WHERE (product.segment_id = ps.id AND product.name = 'diam')
如果你需要给主表设置和示例一样的别名p,可以追加TableAlias方法调整:
_, err := c.postgresDB.WithContext(ctx). Model(&Product{}). TableAlias("p"). // 给主表设置别名p Set("price = ?", 200). Table("product_segment AS ps"). Where("p.segment_id = ps.id"). Where("p.name = ?", "diam"). Update()
调整后生成的SQL和你给出的示例SQL完全匹配:
UPDATE product AS p SET price = 200 FROM product_segment AS ps WHERE (p.segment_id = ps.id AND p.name = 'diam')
注意事项
- 多表更新场景不要使用
Join()系列方法,该方法不会为UPDATE语句生成FROM子句,仅会在SELECT查询中拼接JOIN逻辑 Model()方法必须传入模型结构体的指针,直接传入结构体类型会导致表名、字段映射异常- 如果关联表也有对应的go-pg模型,也可以直接传入模型指针作为Table参数,比如
Table(&ProductSegment{}),go-pg会自动解析表名,不需要硬写表名字符串
内容的提问来源于stack exchange,提问作者Sruthi CP
相关产品推荐
相关产品推荐

