考虑两种数据模型:
Child(id, parent_id) :: ForeignKey on Child.parent_id => Parent.id
Parent(id, children) :: children = relationship(Child.parent_id == id)
以下SQLAlchemy查询:
session.query(Parent.children).limit(1).all()
的产率:
[[False]]
结果不正确,因为没有为每个返回的行列执行关系查询。我期待的输出类似于以下内容:
[[{id:5, parent_id:8}]]
注意当我通过提取整个Parent对象时。 get
children
属性查询正确执行
session.query(Parent).get(8)
# output
# { id: 8, children: [{id:5, parent_id:8}] }
答案 0 :(得分:4)
看一下生成的SQL,我们看到了
>>> print str(s.query(Parent.children))
SELECT parent.id = child.parent_id AS children
FROM parent, child
由于你设置了限制并且我们有一个笛卡尔联接,你的第一个结果是False(因为parent.id可能不等于第一个父和子的child.parent_id)。
AFAIK的原因是Parent.children
不是传统列,而是RelationshipProperty因此行为不同。
假设您希望获得与父母相对应的所有子元素,您可以按照问题的第二部分所示进行操作
>>> par=session.query(Parent).filter_by(id=someid).first()
>>> par.children
此处par.children
将根据您的关系配置进行评估(请参阅手册中的Relationship Loading Techniques),因此“join”SQL可能仅针对第二个表达式发出(如果您有延迟加载关系)
另一个选择是explicilty join并且只获取Child
>>> s.query(Parent).join(Parent.children).with_entities(Child).filter(Parent.id==1).all()
[<__main__.Child object at 0x145b950>, <__main__.Child object at 0x145ba50>]