我有以下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加载结果?或者我是否正在以正确的方式思考这个问题?
山姆在评论中向我指出了正确的答案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。
| 归档时间: |
|
| 查看次数: |
151 次 |
| 最近记录: |