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 關注
- 142 瀏覽
添加回答
舉報