簡體   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