SQLAlchemy中的外键查询

时间:2014-03-16 06:43:37

标签: python django sqlalchemy pyramid

来自Django ORM后,我是SQLAlchemy的新手。我试图创建一个简单的嵌套集模式&我想做父查找。我会在Django ORM中做到这一点:

Page.objects.get(slug="currentlevel",parent__slug="secondlevel",parent__parent__slug="firstlevel")

这将自动查询每个父项的数据库,返回相关的页面行。

在SQLAlchemy中,我能想到的最好的是:

session.query(Page).join(Page.parent, aliased=True).filter_by(slug="child")

所以我可以查询直接的父项,但是如何在一个查询中继续链?动态(如果可能)(任意数量的水平)

请记住我是SQLAlchemy的新手,来自相对受保护的Django ORM。我确定SQLAchemy文档中有相关信息,但我已经通读了它,似乎无法找到它。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您是对的,Self-Referential Query Strategies下sqlalchemy文档中的所有信息。在这种情况下,您的初始查询将如下所示:

from sqlalchemy.orm import aliased
page1 = aliased(Page)
page2 = aliased(Page)
qry = (session
        .query(Page).filter(Page.slug=='currentlevel')
        .join(page1, Page.parent).filter(page1.slug=="secondlevel")
        .join(page2, page1.parent).filter(page2.slug=="firstlevel")
        )

或者,使用aliased(带from_joinpoint)个参数,稍微短一些:

qry = (session
        .query(Page).filter(Page.slug=='currentlevel')
        .join(Page.parent, aliased=True).filter(Page.slug=="secondlevel")
        .join(Page.parent, aliased=True, from_joinpoint=True).filter(Page.slug=="firstlevel")
        )