SQLAlchemy Join #2 Many To One

2018-08-31

Many To One

λ‹€λŒ€μΌ κ΄€κ³„μ—μ„œ child λ₯Ό μ°Έμ‘°ν•˜λŠ” μ™Έλž˜ν‚€λŠ” parent ν΄λž˜μŠ€μ— μœ„μΉ˜ν•΄μžˆλ‹€. relationship() ν•¨μˆ˜
λŠ” parent ν΄λž˜μŠ€μ— μœ„μΉ˜ν•΄μžˆμœΌλ©°, scalar-holding 속성이 생성될것이닀.

    class Parent(Base):
        __tablename__ = 'parent'
        id = Column(Integer, primary_key=True)
        child_id = Column(Integer, ForeignKey('child.id'))
        child = relationship("Child")

    class Child(Base):
        __tablename__ = 'child'
        id = Column(Integer, primary_key=True)

μ–‘λ°©ν–₯ 연결을 λ‘λ²ˆμ§Έ relationship() λ₯Ό μΆ”κ°€ν•˜κ³  μ–‘μͺ½μ—relationship.back_populates νŒŒλΌλ―Έν„°λ₯Ό μ–‘μͺ½μ— μ μš©ν•˜λ©΄ λœλ‹€.

    class Parent(Base):
        __tablename__ = 'parent'
        id = Column(Integer, primary_key=True)
        child_id = Column(Integer, ForeignKey('child.id'))
        child = relationship("Child", back_populates="parents")

    class Child(Base):
        __tablename__ = 'child'
        id = Column(Integer, primary_key=True)
        parents = relationship("Parent", back_populates="child")

λŒ€μ•ˆμœΌλ‘œλŠ” backref νŒŒλΌλ―Έν„°λ₯Ό ν•œμͺ½μ˜ relationship() 에 μ μš©ν•˜λ©΄ λœλ‹€.

    class Parent(Base):
        __tablename__ = 'parent'
        id = Column(Integer, primary_key=True)
        child_id = Column(Integer, ForeignKey('child.id'))
        child = relationship("Child", backref="parents")

ν•„μž ν…ŒμŠ€νŠΈ

μ•„λž˜μ™€ 같이 μœ„μ˜ λͺ¨λΈ ν΄λž˜μŠ€λ“€μ„ ν˜ΈμΆœν•˜λŠ” μ½”λ“œλ₯Ό μ§œλ΄€λ‹€. 잘 호좜이 λœλ‹€. back_populates λ₯Ό μ΄μš©ν•΄μ„œλŠ” parents κ°€ Child ν΄λž˜μŠ€μ— μ •μ˜κ°€ λ˜μ–΄ μžˆμœΌλ‹ˆ μ‹€ν–‰λ˜λŠ”κ²Œ λ§žλŠ”λ°, backref 의 경우 Parent ν΄λž˜μŠ€μ— μ •μ˜κ°€ λ˜μ–΄ μžˆλŠ”λ° c.parents λ‚˜ p.child.parents 뢀뢄이 μ™œ μ—λŸ¬κ°€ μ•ˆλ‚ κΉŒ?

    from model import session
    from model import Child
    from model import Parent

    p = session.query(Parent).filter(Parent.id == 1).scalar()
    print(p.id)
    print(p.child)
    print(p.child.id)
    print(p.child.parents)

    c = session.query(Child).filter(Child.id == 12).scalar()
    print(c)
    print(c.id)
    print(c.parents)
    session.close()

backref 와 back_populates 의 μ°¨μ΄λŠ” 뭘까?

backref: κ΄€κ³„λœ 맀퍼 클래슀의 μ†μ„±μ˜ λ¬Έμžμ—΄ 이름을 가리킨닀. 이 속성은 맀퍼 ν΄λž˜μŠ€κ°€ ꡬ성될 λ•Œ μžλ™μ μœΌλ‘œ μƒμ„±λœλ‹€.

back_popuplates: backref 와 λ™μΌν•œ 의미이고, μžλ™μ μœΌλ‘œ 생성해주지 μ•ŠλŠ”κ²ƒμ΄ 차이. 맀퍼 ν΄λž˜μŠ€μ— λͺ…μ‹œμ μœΌλ‘œ κ΅¬μ„±ν•΄μ€˜μ•Ό ν•œλ‹€.

Parent 맀퍼 ν΄λž˜μŠ€μ—μ„œ back_populates 둜 μ§€μ •ν•œ parents κ°€ λ§Œμ•½ Child 맀퍼 ν΄λž˜μŠ€μ—μ„œ μ„ μ–Έν•˜μ§€ μ•Šμ•˜λ‹€λ©΄ μ•„λž˜μ™€ 같은 μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.

sqlalchemy.exc.InvalidRequestError: Mapper 'Mapper|Child|child' has no property 'parents'

#sqlalchemy  #dev  #join  #Python