亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

包含軟刪除行的連接子句

包含軟刪除行的連接子句

Go
智慧大石 2023-03-21 10:43:17
我在使用go-pgorm 生成正確的選擇查詢時遇到問題,其中一個表記錄可以被軟刪除,而其他 2 個不能。數據庫表:管道實例instance_id 整數pipeline_id 整數event_id 整數管道觸發器你的手pipeline_id 整數deleted_at 時間戳管道觸發事件event_id 整數trigger_id 整數go-pg 型號:type pipelineTriggerEvent struct {    tableName        struct{}          `pg:"pipeline_trigger_events,alias:pte"`    Trigger          *pipelineTrigger  `pg:"rel:has-one,join_fk:id"`    PipelineInstance *pipelineInstance `pg:"rel:has-one,join_fk:event_id"`    *TriggerEvent}type pipelineTrigger struct {    tableName struct{} `pg:"pipeline_triggers,alias:pt"`    *Trigger }type pipelineInstance struct {    tableName struct{} `pg:"pipeline_pipeline_instances,alias:ppi"`    *PipelineInstance}我試圖生成的查詢:SELECT   pte.*, trigger.*, pipeline_instance.*FROM   pipeline_trigger_events AS pte   LEFT JOIN pipeline_triggers AS trigger ON (trigger.id = pte.trigger_id)   LEFT JOIN pipeline_pipeline_instances AS pipeline_instance ON pipeline_instance.event_id = pte.event_id AND trigger.pipeline_id = pipeline_instance.pipeline_id 由 go-pg orm 生成的查詢:SELECT   pte.*, trigger.*, pipeline_instance.*FROM   pipeline_trigger_events AS pte   LEFT JOIN pipeline_triggers AS trigger ON (trigger.id = pte.trigger_id)       AND trigger.deleted_at IS NULL -- this is the unwanted line.  LEFT JOIN pipeline_pipeline_instances AS pipeline_instance ON pipeline_instance.event_id = pte.event_id AND trigger.pipeline_id = pipeline_instance.pipeline_id 在上面提到的所有 3 個表/模型中,只有 pipeline_triggers 表deleted_at具有用于軟刪除的列。我的要求是在結果集中也包括軟刪除的 pipeline_triggers 行。但是orm 會自動在子句中go-pg添加條件。如何刪除此條件并獲取所有行,包括軟刪除行。trigger.deleted_at IS NULLjoin我嘗試使用AllWithDeleted函數,但它適用于主要模型,即 pipeline_trigger_events(并且該表無論如何都沒有 deleted_at 列)而不是 on pipeline_triggers,因此失敗并出現此錯誤: pg: model=PipelineTriggerEvent does not support soft deletes
查看完整描述

1 回答

?
慕斯709654

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

}


查看完整回答
反對 回復 2023-03-21
  • 1 回答
  • 0 關注
  • 142 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號