SQLAlchemy列属性和关系返回布尔值

时间:2015-10-30 03:56:20

标签: python python-3.x sqlalchemy

考虑两种数据模型:

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}] }

1 个答案:

答案 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>]