我有以下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加载结果?或者我甚至以正确的方式思考这个问题?
答案 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
语句。