Python 通过sqlalchemy关系通过backref属性获取父子关系会导致不必要的刷新

Python 通过sqlalchemy关系通过backref属性获取父子关系会导致不必要的刷新,python,sqlite,sqlalchemy,Python,Sqlite,Sqlalchemy,我与sqlalchemy的关系如下(为简单起见进行了修剪): 在工作时,在我的对象中,我执行以下操作: parent = Parent("my parent") db_session.add(parent) # must be done for other reasons not relevant to the issue. child = Child("my child", parent) 到目前为止还不错。 但在提交之前,当我执行以下操作时,我会得到一个数据库刷新: children =

我与sqlalchemy的关系如下(为简单起见进行了修剪):

在工作时,在我的对象中,我执行以下操作:

parent = Parent("my parent")
db_session.add(parent) # must be done for other reasons not relevant to the issue.
child = Child("my child", parent)
到目前为止还不错。 但在提交之前,当我执行以下操作时,我会得到一个数据库刷新:

children = parent.children # using the backref causes a flush

通过更改定义backref/关系的方式可以避免这种情况吗?

我不是SQLAlchemy专家,但在刷新父项和子项之前,SQLAlchemy似乎无法安全地填充父项.children集合,因为在刷新父项和子项之前,用于其关系的主键和外键都是未定义的。也许它甚至需要一个查询,因为它无法事先知道关系所需的所有对象是否都在当前会话中

我看不出有任何解决办法,坦率地说,我不认为这是一个问题。你的案例闻起来很像过早优化


无论如何,我想您可以通过设置
session.autoflush=False
并在离开此点后返回到
True
来禁用会话上的自动刷新。也许它可以工作,但您可能会遇到意外情况。

使用会话。没有自动刷新上下文管理器应该以安全的方式实现您想要的:

with session.no_autoflush:    
    parent = Parent("my parent")
    db_session.add(parent) 
    child = Child("my child", parent)

为什么会出现这个问题?刷新有点贵,在这种情况下不需要刷新,因为父对象的内存中有可用的信息,所以不需要刷新来检索。
with session.no_autoflush:    
    parent = Parent("my parent")
    db_session.add(parent) 
    child = Child("my child", parent)