>source

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을 탐색하고 비슷한 것을 발견했을 때 제기되었습니다.

내 질문은,이 현상이 어떻게 파이썬에서 가능 해졌습니까? 이것은 무한한 객체입니까, 아니면 객체 순환 참조 객체가 있습니까? 이 문제/기능이 무엇인지 확실하지 않으므로 올바른 문구에 넣을 수 없어 죄송합니다.

시간 내 주셔서 감사하고 즐거운 하루를 보내십시오.

문안 인사, 저스틴


  • 답변 # 1

    문제의 쿼리가 일종의 무한한 일련의 객체 인 것처럼 보일 수 있지만 직접 지적했듯이 이것은 순환 참조의 형태로 가장 잘 이해 될 수 있습니다.

    보다 구체적으로, 각 애완 동물 개체는 하나의 소유자를 가질 수 있습니다. 차례로, 각 소유자는 여러 애완 동물을 가질 수 있습니다. 무슨 쿼리

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

    첫 번째 애완 동물의 소유자, 그 소유자의 애완 동물, 첫 번째 애완 동물의 소유자 등을 얻는 것입니다.

    따라서 다음과 같은 되풀이 관계도 설정할 수 있습니다.

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

    따라서 무한 사슬은 실제로 무한한 것이 아닙니다. 검색어는 단순히 원 안에 표시됩니다. @Klaus D.는 이미 현관과 매우 유사합니다. CS에서 잠재적으로 또 다른 직관적 인 참조를 추가 할 수 있습니다. 이것은 트리 데이터 구조입니다. 한 리프에서 상위 노드로 이동 한 다음 다시 리프로 이동합니다.

관련 자료

  • 이전 r - cran 패키지 릴리스 피드백 - 쉽게 억제 할 수없는 정보 메시지를 콘솔에 작성
  • 다음 jquery - 이 경로에는 POST 방법이 지원되지 않습니다