SQLAlchemy Join #3 One to One

2018-09-04

One To One

์ผ๋Œ€์ผ ๊ด€๊ณ„์—์„œ๋Š” ์–‘์ชฝ ๋งคํผ์—์„œ ์Šค์นผ๋ผ ์†์„ฑ์„ ํ†ตํ•œ ์–‘๋ฐฉํ–ฅ ๊ด€๊ณ„๊ฐ€ ํ•„์ˆ˜์ ์ด๋‹ค. ์ด๊ฒƒ์„ ์œ„ํ•ด์„œ uselist flag ๊ฐ€ ์žˆ๋Š”๋ฐ ์ด๊ฒƒ์€ ๋งŽ์€์ชฝ("manyโ€ side of the relationship.)์˜ ์ปฌ๋ž™์…˜ ๋Œ€์‹ ์— ์Šค์นผ๋ผ ์†์„ฑ์˜ ์œ„์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

์ผ๋Œ€๋‹ค ๋ฅผ ์ผ๋Œ€์ผ๋กœ ๋ฐ”๊พธ๋ฉด,

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

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

๋‹ค๋Œ€์ผ์˜ ๊ฒฝ์šฐ,

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

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

ํ•„์žํ…Œ์ŠคํŠธ

uselist ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ .child ์— ์ ‘๊ทผํ•˜๋ฉด parent.id ==1 ์— ๋Œ€ํ•œ ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ถœ๋ ฅ ๋œ๋‹ค. ์ผ๋ฐ˜์ ์ธ ์ผ๋Œ€๋‹ค ๊ด€๊ณ„์—์„œ์˜ ์‚ฌ์šฉ๋ฒ•์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋‘๋ฒˆ์งธ ๊ฒฐ๊ณผ๋Š” ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ uselist=False ๋กœ ์ง€์ •ํ•˜๊ณ ๋‚˜์„œ ํ˜ธ์ถœํ•œ ์ฝ”๋“œ์ด๋‹ค. list ํ˜•์‹์ด ์•„๋‹Œ Child ๊ฐ์ฒด๊ฐ€ ๋ณด์—ฌ์ง€๊ณ  ์žˆ๊ณ , ์›๋ž˜ ๋ฆฌ์ŠคํŠธ์—์„œ ์ฒซ๋ฒˆ์งธ ๊ฐ’์ด ๋ณด์—ฌ์ง„๋‹ค. ์ด ๊ฒฝ์šฐ Multiple rows returned with uselist=False ๊ฒฝ๊ณ ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

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

    >>> [{'parent_id': 1, '_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x00000000046C60F0>, 'id': 11}, {'parent_id': 1, '_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x00000000046C6198>, 'id': 12}, {'parent_id': 1, '_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x00000000046C6048>, 'id': 13}]

    >>> {'parent_id': 1, '_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x0000000003C554E0>, 'id': 11}

#dev  #Python  #sqlalchemy  #join