>백엔드 개발 >Golang >일시 삭제된 행이 있는 조인 절

일시 삭제된 행이 있는 조인 절

PHPz
PHPz앞으로
2024-02-08 20:42:20759검색

包含软删除行的 Join 子句

질문 내용

go-pgorm을 사용하여 올바른 조인 선택 쿼리를 생성하는 데 문제가 있습니다. 테이블 레코드 중 하나는 일시 삭제할 수 있지만 다른 2개의 테이블 레코드는 일시 삭제할 수 없습니다.

데이터베이스 테이블:

파이프라인_인스턴스
instance_id int
pipeline_id int
event_id int
파이프라인_트리거
id 정수
pipeline_id int
deleted_at 타임스탬프
pipeline_trigger_events
event_id int
trigger_id int

go-pg 모델:

으아악

내가 생성하려는 쿼리:

으아악

go-pg orm에 의해 생성된 쿼리:

으아악 으아악

위에 언급된 3개의 테이블/모델 중 파이프라인_triggers 테이블에만 일시 삭제를 위한 deleted_at 열이 있습니다. 내 요구 사항은 결과 집합에 일시 삭제된 Pipeline_triggers 행도 포함하는 것입니다. 하지만 deleted_at列。我的要求是将软删除的 pipeline_triggers 行也包含在结果集中。但是 go-pg orm 会自动在 join 子句中添加 trigger.deleted_at is null orm은 join 절에 trigger.deleted_at is null 조건을 자동으로 추가합니다. 이 조건을 제거하고 일시 삭제된 행을 포함한 모든 행을 얻으려면 어떻게 해야 합니까?

allwithdeleted 함수를 사용해 보았지만 이는 파이프라인_trigger_events(그리고 테이블에 delete_at 열이 없음)인 기본 모델에서는 작동하지만 pipeline_triggers에서는 작동하지 않으므로 다음 오류와 함께 실패합니다. pg: model=pipelinetriggerevent 不支持软删除


정답


pg-go의 코드를 조금 살펴보니, 원하시는 작업이 지원되는지 모르겠습니다. 이를 확인하려면 디버거에서 아래 코드를 단계별로 실행해야 할 수도 있습니다.

조인 쿼리를 작성할 때 다음과 같은 부분으로 구성됩니다.

https://github.com/go -pg/pg/blob/c9ee578a38d6866649072df18a3dbb36ff369747/orm/join.go#l283

으아악

j.appendalias(b) 行调用以下 appendalias() 기능: https://github.com/go-pg/pg/blob/c9ee578a38d6866649072df18a3dbb36ff369747/orm/join.go#l200

으아악

조인은 모두 일대일 상위 관계를 가지므로 모든 테이블에 추가됩니다. https://github.com/go-pg/pg/blob/c9ee578a38d6866649072df18a3dbb36ff369747/orm/join.go#l153

으아악

이 문제를 해결하는 방법은 다른 두 관계가 아닌 부모 관계에 대해서만 appendalias()을 호출하는 것이라고 생각했는데 pg-go에서는 이를 지원하지 않는 것 같습니다.

이렇게 하려면 pg.query()pg.querywithcontext()를 호출하고 위에 포함된 SQL 문을 전달하면 됩니다.

pg-go/pg가 유지 관리 모드에 있으므로 이를 지원할 가능성이 낮다는 점도 언급할 가치가 있습니다. 이 프로젝트가 pg-go에서 얼마나 확고한지에 따라 현재 개발 중인 bun 사용을 고려할 수도 있습니다.

부록

이것은 위의 첫 번째 코드 조각에서 호출된 appendsoftdelete() 함수입니다.

https://github.com/go -pg/pg/blob/c9ee578a38d6866649072df18a3dbb36ff369747/orm/join.go#l189

으아악

위 내용은 일시 삭제된 행이 있는 조인 절의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제