在分配子关系时避免在刷新后选择

shr*_*oud 6 python sqlalchemy

我有以下SQLAlchemy模型:

class Parent(Base):
    id = Column(Integer, primary_key=True)

class Child(Base):
    id = Column(Integer, primary_key=True)
    title = Column(String, nullable=False)
    parent_id = Column(Integer, ForeignKey(Parent.id), nullable=False)

    parent = relationship(Parent, 
                          backref=backref('children',
                                          order_by=id,
                                          cascade='all, delete-orphan'))
Run Code Online (Sandbox Code Playgroud)

然后我想创建一个父母和一些孩子,所有这些都在同一个声明中:

p = Parent()
DBSession.add(p)

# some unrelated code runs which triggers a flush

p.children = [Child(title=title) for title in titles]
Run Code Online (Sandbox Code Playgroud)

p.children =赋值语句触发了一个不需要的SELECT语句,因为SQLAlchemy必须清除任何Child指向该语句的预先存在的对象Parent.我意识到我可以SELECT使用lazy='noload'backref上的选项消除语句,但我需要这种关系在其他上下文中正常运行(即从DB获取结果).

有没有办法我可以创建一个返回noload关系值的属性,如果已经设置,并使用常规关系从DB加载结果?或者我是否正在以正确的方式思考这个问题?

shr*_*oud 2

山姆在评论中向我指出了正确的答案DBSession.no_autoflush

with DBSession.no_autoflush:
    p = Parent()
    DBSession.add(p)

    # some unrelated code runs which triggers a flush

    p.children = [Child(title=title) for title in titles]
Run Code Online (Sandbox Code Playgroud)

这消除了SELECT分配给 时不需要的语句p.children