1 回答
TA贡献1840条经验 获得超5个赞
稍微浏览了一下 pg-go 的代码后,我不知道是否支持您尝试做的事情。要确定您可能想在调试器中单步执行下面的代码。
为连接构建查询时,它包含以下部分:
https://github.com/go-pg/pg/blob/c9ee578a38d6866649072df18a3dbb36ff369747/orm/join.go#L283
if isSoftDelete {
b = append(b, " AND "...)
b = j.appendAlias(b)
b = j.appendSoftDelete(b, q.flags)
}
该行j.appendAlias(b)调用appendAlias()以下函数: https://github.com/go-pg/pg/blob/c9ee578a38d6866649072df18a3dbb36ff369747/orm/join.go#L200
func appendAlias(b []byte, j *join) []byte {
if j.hasParent() {
b = appendAlias(b, j.Parent)
b = append(b, "__"...)
}
b = append(b, j.Rel.Field.SQLName...)
return b
}
由于连接都具有一对一的父关系,因此会为所有表添加它: https://github.com/go-pg/pg/blob/c9ee578a38d6866649072df18a3dbb36ff369747/orm/join.go#L153
func (j *join) hasParent() bool {
if j.Parent != nil {
switch j.Parent.Rel.Type {
case HasOneRelation, BelongsToRelation:
return true
}
}
return false
}
我认为为您解决这个问题的方法是只调用appendAlias()父关系而不是其他两个,但它看起来不像 pg-go 支持的那样。
您可以为此做的只是调用pg.Query()orpg.QueryWithContext()并传入上面包含的 sql 语句。
还值得一提的是,pg-go/pg 处于维护模式,因此他们不太可能永远支持它。根据该项目在 pg-go 中的根深蒂固程度,您可能会考虑使用正在积极开发的Bun 。
附录
这是appendSoftDelete()在上面的第一个片段中调用的函数:
https://github.com/go-pg/pg/blob/c9ee578a38d6866649072df18a3dbb36ff369747/orm/join.go#L189
func (j *join) appendSoftDelete(b []byte, flags queryFlag) []byte {
b = append(b, '.')
b = append(b, j.JoinModel.Table().SoftDeleteField.Column...)
if hasFlag(flags, deletedFlag) {
b = append(b, " IS NOT NULL"...)
} else {
b = append(b, " IS NULL"...)
}
return b
}
- 1 回答
- 0 关注
- 167 浏览
添加回答
举报
