[英]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.