2017년/Database

sqlalchemy relationship

위지원 2017. 8. 29. 15:03

http://docs.sqlalchemy.org/en/latest/orm/basic_relationships.html


관계에대한 이해도가 부족한것같아 공식문서를 다시읽어보았다.


1. 1:N 관계

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

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



2.N:1 관계


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)


3.1:1 관계


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)


4.N:M 관계

association_table을 추가하여 두 테이블을 연결시켜준다.


association_table = Table('association', Base.metadata, Column('left_id', Integer, ForeignKey('left.id')), Column('right_id', Integer, ForeignKey('right.id')) ) class Parent(Base): __tablename__ = 'left' id = Column(Integer, primary_key=True) children = relationship("Child",secondary=association_table) class Child(Base): __tablename__ = 'right' id = Column(Integer, primary_key=True)



정리하자면..


    child_id = Column(Integer, ForeignKey('child.id'))

column에 직접넣은 지시작는 대상의 컬럼을 따르도록 하고.. ( parent가 child테이블의 id를 따르게한다) 이렇게해서 둘을 붙여주는것!


child = relationship("Child", back_populates="parent")


relationshion 지시자는 여기서는 parent 클래스자체가 child 클래스에 연결되어있다는 사실을 parent.chlid 속성을 통해 알 수 있게한다.

back_populates또 역으로 클래스를 이용할수 있게 하는것이다. 


그러니까 즉 parent를 하나 만들면 비어있는 child가 하나 생기는것이라는것 !!그래서 클래스명.클래스명 이런식으로 접근할 수 있다.