繁体   English   中英

了解SQLAlchemy ForeignKey 关系查询结果

[英]Understanding SQLAlchemy ForeignKey Relationship query results

我试图了解 SQLAlchemy 查询 output 如何可以连续嵌套,就好像它是一个无限的 object。 (我确定这不是正确的称呼方式)

场景如下。 我在用户和他们的宠物之间创建了一对多的关系。

class User(Base):
    __tablename__ = "users"
    id = Column(Integer, primary_key=True)
    name = Column(String, unique=True)

    pets = relationship("Pet", back_populates="owner")

class Pet(Base):
    __tablename__ = "pets"
    id = Column(Integer, primary_key=True)
    name = Column(String)
    owner_id = Column(Integer, ForeignKey("users.id"))

    owner = relationship("User", back_populates="pets")

现在,当我查询用户时,我还可以查询宠物信息,如下所示:

records = session.query(User).all()

这将返回一个用户列表,他们的宠物在虚构的领域中。
现在,当我尝试访问宠物信息时,我可以通过访问数组来实现。 例如:

records[0].pets[0].name

同时我可以不断地再次访问用户,然后再次访问宠物数量和用户等等……

records[0].pets[0].owner.pets[0].owner.pets[0].....

这个问题是我在探索 graphQL 时提出的,遇到了类似的情况。

我的问题是,这种现象是如何在 Python 中实现的? 这是无限的 object 还是有一些 object 循环引用的东西? 很抱歉,我无法用正确的措辞来说明这个问题,因为我不确定这个问题/功能是什么。

非常感谢大家的宝贵时间,祝您有愉快的一天。

问候,
贾斯汀

编辑:
找到解释这一点的文档!
https://docs.sqlalchemy.org/en/13/orm/self_referential.html

我可以看到有问题的查询可能看起来是某种无限的对象链,但正如您自己指出的那样,这可能最好理解为循环引用的一种形式。

更具体地说,每只宠物 object 可以有一个主人。 反过来,每个主人可以拥有多只宠物。 查询什么

records[0].pets[0].owner.pets[0].owner.pets[0].....

正在做的是你得到第一个宠物的主人,然后是那个主人的宠物,然后是第一个宠物的主人,等等。

因此,我们也可以建立以下递归关系。

records[0].pets[0] = records[0].pets[0].owner.pets[0]

因此,在引擎盖下,无限链并不是真正的无限。 查询只是绕圈子。 @Klaus D. 已经提供了一个很好的前门类比。 我可能会在此处添加 CS 中另一个可能直观的参考,它是一种树数据结构:您正在从一个叶子移动到它的父节点,然后返回到叶子。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM