sqlalchemy back_pumulates는 언제 사용해야 합니까?
이 가이드에 따라 SQL 화학 관계 예제를 사용해 보면 다음과 같습니다.기본 관계 패턴
이 코드를 가지고 있습니다.
#!/usr/bin/env python
# encoding: utf-8
from sqlalchemy import create_engine
from sqlalchemy import Table, Column, Integer, ForeignKey
from sqlalchemy.orm import relationship, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
engine = create_engine('sqlite:///:memory:', echo=True)
Session = sessionmaker(bind=engine)
session = Session()
Base = declarative_base(bind=engine)
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'))
parent = relationship("Parent")
Base.metadata.create_all()
p = Parent()
session.add(p)
session.commit()
c = Child(parent_id=p.id)
session.add(c)
session.commit()
print "children: {}".format(p.children[0].id)
print "parent: {}".format(c.parent.id)
잘 작동하지만, 가이드에는 모델이 다음과 같이 나와 있습니다.
class Parent(Base):
__tablename__ = 'parent'
id = Column(Integer, primary_key=True)
**children = relationship("Child", 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="children")**
필요 없는 이유back_populates
또는backref
내 예에서?제가 어느 한쪽을 언제 사용해야 합니까?
사용하는 경우backref
두 번째 테이블에서 관계를 선언할 필요는 없습니다.
class Parent(Base):
__tablename__ = 'parent'
id = Column(Integer, primary_key=True)
children = relationship("Child", backref="parent")
class Child(Base):
__tablename__ = 'child'
id = Column(Integer, primary_key=True)
parent_id = Column(Integer, ForeignKey('parent.id'))
사용하지 않는 경우backref
그리고 정의합니다.relationship
별도로, 만약 당신이 사용할 수 있습니다.back_populates
sqlalchemy는 관계를 연결하는 방법을 알지 못하므로 하나를 수정하면 다른 하나도 수정됩니다.
그래서, 당신의 예에서, 당신이 정의한 것은.relationship
는 별도이지만, 제공하지 않았습니다.back_populates
인수, 한 필드를 수정하면 트랜잭션에서 다른 필드가 자동으로 업데이트되지 않습니다.
>>> parent = Parent()
>>> child = Child()
>>> child.parent = parent
>>> print(parent.children)
[]
자동으로 입력되지 않은 상태 확인children
필드?
이제, 만약 당신이 공급한다면.back_populates
인수, sqlalchemy가 필드를 연결합니다.
class Parent(Base):
__tablename__ = 'parent'
id = Column(Integer, primary_key=True)
children = relationship("Child", 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="children")
그래서 이제 우리는.
>>> parent = Parent()
>>> child = Child()
>>> child.parent = parent
>>> print(parent.children)
[Child(...)]
Sqlalchemy는 이 두 필드가 현재 관련되어 있다는 것을 알고 있으며, 다른 필드가 업데이트됨에 따라 서로 업데이트됩니다.를 사용하는 것은 주목할 가치가 있습니다.backref
이것도 할 것입니다.사용.back_populates
모든 클래스에서 관계를 정의하려는 경우 유용하므로 backref를 통해 필드를 정의하는 다른 클래스를 볼 필요 없이 모든 필드가 모델 클래스를 힐끗 볼 수 있습니다.
언급URL : https://stackoverflow.com/questions/39869793/when-do-i-need-to-use-sqlalchemy-back-populates
'programing' 카테고리의 다른 글
하나의 블록에 여러 개의 시도 코드가 있음 (0) | 2023.08.05 |
---|---|
Android:제목 없이 대화 상자를 만드는 방법은 무엇입니까? (0) | 2023.08.05 |
전체 폴더 및 내용을 삭제하는 방법은 무엇입니까? (0) | 2023.07.31 |
장고에서 양식에 대한 테스트를 어떻게 작성해야 합니까? (0) | 2023.07.31 |
이름에 점(.)이 있는 PowerShell 환경 변수 (0) | 2023.07.31 |