Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLAlchemy中的外键查询_Python_Django_Sqlalchemy_Pyramid - Fatal编程技术网

Python SQLAlchemy中的外键查询

Python SQLAlchemy中的外键查询,python,django,sqlalchemy,pyramid,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.

我刚从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文档中有一些信息,但我已经通读了一遍,似乎找不到


谢谢你的帮助。

你说得对,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")
        )
或者,使用
别名
(带有
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")
        )

在单个查询中执行所有操作的愿望都是过早的优化:)发出2-3-5个单独的简单查询(每个查询通过其主键获取单个对象)实际上可能比具有2-3-5级自引用联接的单个monster查询要快,尤其是当表中有许多行时。即使单独的查询稍微慢一点——我们所说的是微秒,这在总体方案中可以忽略不计。如果你考虑这一点,事情就变得简单多了:另一个建议:这个用例是一个教科书的例子,Pyramid的URL遍历将闪耀。Traversal非常棒,试试看:)我实际上在使用Traversal,但使用它来堆叠join命令。我将进行一些分析,但一般来说,我尽量避免调用数据库。很有可能我想错了,在我的机器上,通过PK从表中提取一行需要0.5毫秒。使用最简单的自引用联接从查询中获取单行(
SELECT*from mytable a join mytable b ON a.id=b.id,其中a.id='boo'
)需要0.9毫秒。从具有2个自引用联接的查询中获取单行大约需要1.2毫秒。所以基本上是一样的。如果你只想在面包屑或菜单中显示他们的标题,那么你就很有可能需要取出这些母版页。