考虑两个数据模型:
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}]]
注意当我通过获取整个父对象时。 get
,children
属性查询正确执行
session.query(Parent).get(8)
# output
# { id: 8, children: [{id:5, parent_id:8}] }
最佳答案
查看生成的 SQL,我们发现
>>> print str(s.query(Parent.children))
SELECT parent.id = child.parent_id AS children
FROM parent, child
由于您设置了限制并且我们有笛卡尔连接,因此您的第一个结果为 False(因为第一个父级和子级的parent.id可能不等于child.parent_id)。
据我所知,原因是 Parent.children
不是传统的列,而是 RelationshipProperty因此表现不同。
假设您想要获取与父元素相对应的所有子元素,您可以按照问题第二部分中所示的方式进行操作
>>> par=session.query(Parent).filter_by(id=someid).first()
>>> par.children
此处 par.children
将根据您的关系配置进行评估(请参阅手册中的 Relationship Loading Techniques),因此可能仅针对第二个表达式发出“join”SQL(如果您有惰性)加载关系)
另一种选择是显式加入并仅获取子项
>>> s.query(Parent).join(Parent.children).with_entities(Child).filter(Parent.id==1).all()
[<__main__.Child object at 0x145b950>, <__main__.Child object at 0x145ba50>]
关于python - SQLAlchemy 列属性和关系返回 bool 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33428411/