Python 如何知道在Postgres批量更新事务中哪个记录失败

Python 如何知道在Postgres批量更新事务中哪个记录失败,python,postgresql,error-handling,sqlalchemy,nested-transactions,Python,Postgresql,Error Handling,Sqlalchemy,Nested Transactions,问题 我必须使用sqlalchemy更新Postgres数据库中的几个记录。操作必须是原子的;i、 例如,如果Ri失败,则必须回滚整个事务 代码如下所示: try: for instance_id in payload: instance = get_or_404(instance_id) sql = build_sql_for_patch(instance, payload) db.session.add(sql) db.sess

问题

我必须使用sqlalchemy更新Postgres数据库中的几个记录。操作必须是原子的;i、 例如,如果
Ri
失败,则必须回滚整个事务

代码如下所示:

try:
    for instance_id in payload:
        instance = get_or_404(instance_id)
        sql = build_sql_for_patch(instance, payload)
        db.session.add(sql)
    db.session.commit()
except Exception:
    db.session.rollback()
    raise ValueError(...)
如果出现错误,我希望返回如下消息:

{
   "errors": [
      {"record": 1, "reason": "Something is wrong with record 1."},
      {"record": 4, "reason": "Something is wrong with record 4."},
      ...
   ]
}
问题


有没有一种方法可以获得这种粒度的Postgres事务错误?理想情况下,我希望每个失败的记录都有一个错误。如果这是不可能的,我希望获取失败的记录号,并显示正确的错误消息。

如果没有其他错误,您可以尝试在保存点中进行每次插入,设置一个控制是回滚还是提交的标志。不过,它的性能不是很好,所以对于大批量操作来说,它的速度会很慢。我来看看SAVEPOINT,谢谢!如果您这样做了,下面是关于该主题的SQLA文档: