Python 如何从psycopg2 connection.commit()获取受影响的行数?

Python 如何从psycopg2 connection.commit()获取受影响的行数?,python,psycopg2,Python,Psycopg2,目前,我使用Python中的psycopg2执行INSERT/UPDATE/DELETE语句的方法如下: 但是我真正希望它做的是,而不是bool,返回受事务影响的行计数,或者如果操作失败,返回-1 是否有方法获取受_cxn.commit影响的多行?例如,对于单个INSERT,它将始终为1;对于DELETE或UPDATE,受语句影响的行数等?commit不能用于获取行数,但您可以在每次execute调用后使用光标获取该信息。您可以使用其rowcount属性获取受选择、插入、更新和删除影响的行数 i

目前,我使用Python中的psycopg2执行INSERT/UPDATE/DELETE语句的方法如下:

但是我真正希望它做的是,而不是bool,返回受事务影响的行计数,或者如果操作失败,返回-1

是否有方法获取受_cxn.commit影响的多行?例如,对于单个INSERT,它将始终为1;对于DELETE或UPDATE,受语句影响的行数等?

commit不能用于获取行数,但您可以在每次execute调用后使用光标获取该信息。您可以使用其rowcount属性获取受选择、插入、更新和删除影响的行数

i、 e

如果要返回受影响的行数,我建议不要捕获任何异常,因为如果操作确实失败,比如说查询格式错误,或者存在FK约束冲突等,则应引发异常,在这种情况下,调用方可以捕获该异常并按需操作。或者,如果您希望集中异常处理,可能会引发自定义MyPostgresException或类似的异常


-在某些情况下,1可以在非故障情况下返回,因此我建议不要使用该值作为故障指示器。如果您真的想在失败的情况下返回一个数值,那么返回-10这样的数字可能会在except块中起作用,因为rowcount永远不会返回该值。

您给出了不捕获异常的充分理由,但是否有理由db_crsr.close不在finally块中?它将在方法结束时超出范围。@jpmc26:Nope。这是OP的原始代码,我没有关注这方面。在这种特殊情况下,我可能会在with块中声明光标,这样它就会自动关闭。我真傻。忘记与我的生活中需要更多的Python。@jpmc26:=是的,这正是它的完美例子,IMO-compact函数,其中游标是短期的,只涉及一个。不要使用bare Exception子句!您应该使用psycopg2.errors模块。列表中有一个完整的列表
def exec_statement(_cxn, _stmt):
    try:
        db_crsr = _cxn.cursor()
        db_crsr.execute(_stmt)
        _cxn.commit()
        db_crsr.close()
        return True
    except:
        return False
    db_crsr = _cxn.cursor()
    db_crsr.execute(_stmt)

    rowcount = db_crsr.rowcount

    _cxn.commit()
    db_crsr.close()

    return rowcount