代码之家  ›  专栏  ›  技术社区  ›  evan

在SQLAlchemy中查询父级的特定子级

  •  2
  • evan  · 技术社区  · 7 年前

    我正在尝试编写一个查询,该查询将从父对象返回一个子对象。

    我的模型如下:

    class Parent (Base):
        __tablename__ = 'parents'
        id = Column(Integer, primary_key=True)
        name = Column(String)
        children_id = Column(Integer, ForeignKey('children.id'))
        childern = relationship('Child', back_populates='parents')
    
    class Child (Base):
        __tablename__ = 'children'
        id = Column(Integer, primary_key=True)
        name = Column(String)
        parent = relationship('Parent', back_populates='children')
    

    举个例子:有三位家长和他们的孩子:

    Alice: Zander, Ygrite, Xaiver
    Bob: Will, Ulric, Tammy
    Chris: Will, Sam, Xaiver
    

    请注意,克里斯巧合地给他的一些孩子起了与其他孩子相同的名字,尽管他们是不同的孩子。

    如果我特别想找到Chris的孩子Xavier,我的第一反应是要么查询父母Chris,然后迭代他的孩子,直到我找到Xavier,要么查询所有名为Xavier的孩子,然后迭代他们,直到我找到有父母Chris的孩子。

    然而,这个解决方案不可扩展,而且肯定没有使用SQLAlchemy的功能。

    1 回复  |  直到 7 年前
        1
  •  2
  •   evan    7 年前

    在继续研究这一挑战的过程中,我遇到了这个问题和公认的答案: SQLAlchery query filter on child attribute

    我测试了这个查询。。。

    s.query(Child).join(Parent, Child.parent).filter(Child.name == 'Xavier').filter(Parent.name == 'Chris')
    

    ...它正是我想要它做的。