如何在O(1)查询中过滤父母和子女?

时间:2013-09-01 07:48:12

标签: python sql sqlalchemy

我有一对具有基本父/子关系的模型。孩子有一个字段foo。我想创建一个SQLAlchemy查询,该查询将返回所有具有foo匹配条件的子对象的Parent对象。与那些父母一起,我想要归还孩子,但前提是他们符合过滤标准。

这些是我的模特:

class Parent(Model):
    __tablename__ = 'parent'
    id = Column(Integer, primary_key=True)
    children = relationship('Child', backref='parent')

class Child(Model):
    __tablename__ = 'child'
    id = Column(Integer, primary_key=True)
    foo = Column(String(128))
    parent_id = Column(Integer, ForeignKey('parent.id'), nullable=False)

这是一个例子。假设我有父母AB。我有孩子a1a2b1b2。子a1foo = 1a2.foo = 2,等等。

我想创建一个类似“child.foo == 1”的查询,并获取此数据:

[
    {
        id: 'A',
        children: ['a1'],
    },
    {
        id: 'B',
        children: ['b1'],
    }
]

请注意,结果中不包含a2b2

到目前为止我已经考虑了两个想法,但还没有解决:

  1. 选择子项,然后构建父对象。

    当我这样做时,我无法查询父级的字段,这也是必需的。

  2. 选择父母,然后遍历匹配的父母并进行更多查询以收集匹配的孩子。

    这(似乎)要求O(n)查询,我不想这样做。

1 个答案:

答案 0 :(得分:1)

要从单个查询中获得所需内容,您需要使用join()contains_eager()

q = session.query(Parent).\
    join(Parent.children).\
    options(contains_eager(Parent.children)).\
    filter(Child.foo == 1)