2016-06-16 4 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から撮影:

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) 

あなたが望むすべてのIDがある場合、あなたは第2工程を省略することができます。

少し厄介なので、私は通常、非正規化して列をTaskに保存することをお勧めします。

+0

ありがとうございました!そして、Task.latest_revision_idを使って、それに参加するだけですか? – timbo

+0

@imbo yep、前者の場合のようにサブクエリに結合するよりはるかに簡単です。 – univerio

+0

私はlatest_revision_idの列を追加することもまた別の問題を提起し、それがこの値の一貫性を維持する方法だと思います。いくつかの考えの後では、新しいリビジョンを作成し、このコラムを更新することは、同じトランザクション(つまりSession)内で行われなければならないので、矛盾の可能性は存在しないように見えるはずです。 – timbo

関連する問題