go-pg
orm을 사용하여 올바른 조인 선택 쿼리를 생성하는 데 문제가 있습니다. 테이블 레코드 중 하나는 일시 삭제할 수 있지만 다른 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!