2016-06-16 2 views
1

다른 테이블의 엔터티에 대한 여러 개정판이 포함 된 단일 테이블이 있습니다 (작업). 따라서 각 TaskRevision 행에는 고유 한 자동 증가 ID와 작업 ID에 대한 참조가 있습니다.SQLAlchemy에서 최신 개체를 얻는 방법

모든 작업의 ​​최신 개정판은 어떻게 찾을 수 있습니까? 나는 시도했다 :

session.query(TaskRevision.id).order_by(TaskRevision.task_id).filter(TaskRevision.id==func.max(TaskRevision.id)).all() 

session.query(TaskRevision.id).group_by(TaskRevision.task_id, TaskRevision.id).having(TaskRevision.id==func.max(TaskRevision.id)) 

답변

1

이 약간 할 짜증나지만, this question에서 가져가 : 당신이 원하는 모든 ID를하는 경우

subq = session.query(TaskRevision.task_id, func.max(TaskRevision.id).label("max_id")) \ 
       .group_by(TaskRevision.task_id).subquery() 
session.query(Task) \ 
     .join(subq, Task.id == subq.c.task_id) \ 
     .join(TaskRevision, TaskRevision.id == subq.c.max_id) \ 
     .with_entities(Task, TaskRevision) 

두 번째 단계를 건너 뛸 수 있습니다.

조금 성가기 때문에 보통은 비정규 화하고 latest_task_revision_id 열을 Task에 보관하는 것을 선호합니다.

+0

고마워요! 그리고 Task.latest_revision_id를 사용하면 그것에 대한 조인을 수행 할 수 있습니까? – timbo

+0

@timbo 예전의 경우와 같이 하위 쿼리에 가입하는 것보다 훨씬 간단합니다. – univerio

+0

나는 latest_revision_id 컬럼을 추가하는 것이 또 다른 질문을 던지기 때문에이 값의 일관성을 유지하는 방법이라고 생각한다. 몇 가지 생각이 들자면, 동일한 수정 (예 : Session) 내에서 새 수정 버전을 만들고이 열을 업데이트해야 * 불일치 가능성이 없어야합니다. – timbo

관련 문제