SQL / SQLAlchemy中的“嵌套”查询

时间:2015-02-09 23:55:13

标签: python sql sqlalchemy

我正在使用SQLAlchemy(对它和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()

返回事物对象的列表(除了注释之外我还需要它们)。然后我遍历这个列表,并为每个事情做一个单独的查询:

comms = meta.Session.query( Thing )
    .filter_by(objType = 'comment').filter(Thing.data.any(wc('thingCode', code))) \
    .filter(Thing.date >= date) \
    .order_by('-date').all()

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

a)不是为n个长度的事物列表运行第二个查询n次,有没有办法在单个查询中执行它,同时仍然为每个ID返回一组单独的结果(可能是在表单中)列表的ID列表)?我想我可以做一个value_in(listOfIds)来获取我想要的所有评论的单个列表,然后迭代并手动构建字典,但我觉得有一种方法可以使用JOIN这个。

b)我在这里过度优化了吗?我刚刚提到的第二种方法会更好吗?我将它们全部卷入单笔交易中是否重要?我的大部分经验都是Neo4j,它很好地将许多小事务透明地嵌套到较大的事务中 - SQL / SQLAlchemy是否具有类似的功能,或者最小化查询数量是否符合我的利益?

0 个答案:

没有答案