在 sqlalchemy 中提交时是不是有添加与删除的顺序

Posted

技术标签:

【中文标题】在 sqlalchemy 中提交时是不是有添加与删除的顺序【英文标题】:Is there any order for add versus delete when committing in sqlalchemy在 sqlalchemy 中提交时是否有添加与删除的顺序 【发布时间】:2020-03-23 03:10:43 【问题描述】:

我正在向 sqlalchemy 的表中添加一堆条目。如果条目已经存在,基于某个键,我删除表中的行,然后添加“更新”条目。完成删除和添加所有条目后,我提交会话。然而,在测试期间,由于唯一约束失败,提交失败。我对此错误的理解是,我正在尝试在删除旧条目之前添加更新的条目。如果我删除旧条目,然后提交,然后添加,一切正常。

所以我的问题是,sqlalchemy 是否有定义的删除和添加操作顺序?是否可以更改此顺序?查看我的代码,我注意到我添加的对象被实例化了两次,但只添加了一次(见下文)-也许这是一个问题(但不确定为什么会这样)。

我也不想要 commit(),因为我只想在完成添加/更新所有条目后提交。

#Inside a loop
#-----------------------
temp_doc = Document(doc)
dirty_doc = session.query(Document).filter(Document.local_id == temp.local_id).first()

#other non-relevant code here ...

session.delete(dirty_doc)

#This seems to be needed but I wouldn't expect it to be 
session.commit() 

#Later on in the code ...
if add_new_doc:
    temp_doc = Document(doc)
    session.add(temp_doc)

#Outside the loop
#-----------------------------
session.commit()
session.close()

【问题讨论】:

【参考方案1】:

这里询问了一个类似但不同的问题,即在添加的对象中是否保持顺序: Does SQLAlchemy save order when adding objects to session?

这提示查看会话代码,因为我没有看到任何有关刷新行为的文档。

会话代码链接: https://github.com/sqlalchemy/sqlalchemy/blob/master/lib/sqlalchemy/orm/session.py

搜索def _flush(self

在代码中,添加和更新似乎是在删除之前完成的,这可以解释我遇到问题的原因。

作为修复,我现在正在刷新而不是提交(在循环内),这似乎解决了问题。我假设保持刷新顺序,即首先刷新的命令首先提交/保存。

【讨论】:

以上是关于在 sqlalchemy 中提交时是不是有添加与删除的顺序的主要内容,如果未能解决你的问题,请参考以下文章

在 SQLAlchemy 中,如何在提交之前预览 SQL 语句以进行调试?

SQLalchemy 在设置角色时不提交更改

使用 sqlalchemy 在刷新/提交时自动散列主键并使其持久化

从 sqlite3 数据库上的表单提交中的 sqlalchemy 行更新行为不一致

在添加Flask,SQLAlchemy之前检查表中的行中的值是不是已经存在

SQLAlchemy 在使用 fetchall 方法迭代结果后提交 sql 执行