python - 了解 SQLAlchemy ForeignKey 关系查询结果
问题描述
我试图了解 SQLAlchemy 查询输出如何连续嵌套,就好像它是一个无限对象一样。(我确定这不是正确的称呼方式)
场景如下。我在用户和他们的宠物之间创建了一对多的关系。
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 中实现的?这是一个无限的对象还是有一些对象循环引用的东西?很抱歉,我无法用正确的措辞来说明这个问题,因为我不确定这个问题/功能是什么。
非常感谢大家的宝贵时间,祝您有愉快的一天。
问候,
贾斯汀
编辑:
找到解释这一点的文档!
https://docs.sqlalchemy.org/en/13/orm/self_referential.html
解决方案
我可以看到有问题的查询可能看起来是某种无限的对象链,但正如您自己指出的那样,这可能最好理解为循环引用的一种形式。
更具体地说,每个宠物对象都可以有一个所有者。反过来,每个主人可以拥有多只宠物。查询什么
records[0].pets[0].owner.pets[0].owner.pets[0].....
正在做的是你得到第一个宠物的主人,然后是那个主人的宠物,然后是第一个宠物的主人,等等。
因此,我们也可以建立以下递归关系。
records[0].pets[0] = records[0].pets[0].owner.pets[0]
因此,在引擎盖下,无限链并不是真正的无限。查询只是绕圈子。@Klaus D. 已经提供了一个很好的前门类比。我可能会在此处添加 CS 中另一个可能直观的参考,它是一种树数据结构:您正在从一个叶子移动到它的父节点,然后返回到叶子。
推荐阅读
- java - 如何在不使用 Spring 或 Spring Boot 的情况下使用 Micrometer 在 TICK 堆栈上收集指标?
- github - 链接到 stash / bitbucket 中的特定代码行?
- python-3.x - Python 我想搜索一个文本文档并查找开始和结束不同但中间可能有不同信息的数据
- javascript - 对 onChange 与 onClick 中的文件的引用?
- julia - 如何在 Julia 中使用 LibPQ 插入记录?
- c++ - 如何将字符串与结构(也包括字符串)进行比较?
- javascript - 您可以使用 jQuery 在 Android webView 上的数字输入字段中防止输入“句点”或“点”吗?
- javascript - 确保在承诺链中发生某些步骤或提前停止链
- twilio - Twilio Studio 帮助将名字传递给调用者
- ruby-on-rails - Rails Prawn 文档的嵌入式字体错误