IT/파이썬

SQLAlchemy One to One 설정하기 (backref와 back_populates 차이)

thesse 2021. 12. 10. 14:27
300x250
반응형

원래 양방향 참조를 하려면 부모/자식 엔티티 각각에서 back_populates를 해줘야 함

class Parent(Base):
    __tablename__ = 'parent'
    id = Column(Integer, primary_key=True)
    children = relationship("Child", back_populates="parent") # on the parent class

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

 

 

 

backref를 사용하면 한쪽에만 참조 설정을 해도 반대쪽을 자동으로 생성해준다

class Parent(Base):
    __tablename__ = 'parent'
    id = Column(Integer, primary_key=True)    
    # children = relationship("Child", backref="parent")  # only on the parent class
    
class Child(Base):
    __tablename__ = 'child'
    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer, ForeignKey('parent.id'))    
    parent = relationship("Parent", backref="children") # only on the child class

 

 

참조 : https://stackoverflow.com/questions/51335298/concepts-of-backref-and-back-populate-in-sqlalchemy

참조 : https://docs.sqlalchemy.org/en/14/orm/basic_relationships.html

 

 

 

 

이렇게 참조를 시키면 기본적으로 One to Many 로 정의되는데, One to One으로 정의하려면 아래처럼 uselist=False를 추가하면 됨

parent = relationship("Parent", backref=backref("child", uselist=False))

 

엄연히 말해서 1:0이 될 수도 있기 때문에 진짜 one to one 매핑은 아니지만

list가 아닌 객체 하나를 바로 가져다쓸 수는 있음...

 

300x250
반응형