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

时间:2017-11-07 21:22:28

标签: 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'))

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

p = Parent()
DBSession.add(p)

# some unrelated code runs which triggers a flush

p.children = [Child(title=title) for title in titles]

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

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

1 个答案:

答案 0 :(得分:2)

Sam在评论中指出了正确答案,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]

这可以在分配给SELECT时消除不需要的p.children语句。