programing

sqlalchemy back_pumulates는 언제 사용해야 합니까?

instargram 2023. 8. 5. 09:49
반응형

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_populatessqlalchemy는 관계를 연결하는 방법을 알지 못하므로 하나를 수정하면 다른 하나도 수정됩니다.

그래서, 당신의 예에서, 당신이 정의한 것은.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

반응형