python - SQLAlchemy 列属性和关系返回 bool 值

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

注意当我通过获取整个父对象时。 getchildren属性查询正确执行

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/

相关文章:

python - 在 python 中,我如何从数组的元素中获取字符串的一部分

python - 排列 : producing cycle notation

javascript - 如何从属性 style="display :none; 的元素中提取文本

python - 一个对象两个外键指向同一张表

python - 使用同一模型创建两个不同的表

python - Keras 中 Adam 优化器的衰减参数

C 到 python 代码转换

python - 如何修复对象图像无法正确加载的问题

python - SQLAlchemy 忽略查询中的特定字段

python - 为什么 numpy.sum 没有给我正确的结果?