SQL/SQLAlchemy中的“嵌套”查询

2024-04-25 23:27:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是SQLAlchemy(对it和SQL来说都是相对较新的),我想得到一个发布到一组东西上的所有评论的列表,但是我只对从某个日期开始发布的评论感兴趣,并且每种评论的日期都是不同的:

为了澄清,我现在要做的是:我从一个字典开始,它将我感兴趣的每件事物的ID代码映射到我对该事物感兴趣的日期。我做了一个快速列表理解,只得到代码列表(thingCodes),然后执行以下查询:

things = meta.Session.query(Thing)\
    .filter(Thing.objType.in_(['fooType', 'barType']))\
    .filter(Thing.data.any(and_(Data.key == 'thingCode',Data.value.in_(thingCodes))))\
    .all()

它返回一个thing对象的列表(除了注释之外,我还需要这些对象)。然后,我遍历这个列表,并对每件事执行一个单独的查询:

^{pr2}$

这是可行的,但是单独执行所有这些查询似乎效率极低。所以,我有两个问题:

a)与其对n个长度的列表运行第二个查询n次,是否有一种方法可以在单个查询中执行此操作,同时仍然为每个ID返回一组单独的结果(大概是以ID的to list字典的形式)?我想我可以做一个value_in(listOfIds)来获得我想要的所有注释的一个列表,然后迭代并手动构建字典,但是我觉得有一种方法可以使用JOINs。在

b)我是否过度优化?我用刚才提到的第二种方法会更好吗?我把它们都放到一个单独的事务中有那么重要吗?我的主要经验是使用Neo4j,它非常擅长将许多小事务透明地嵌套到更大的事务中—SQL/SQLAlchemy是否具有类似的功能,或者最小化查询数量绝对符合我的兴趣?在


Tags: 方法代码inid列表sqldata字典