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

2024-03-28 14:50:52 发布

您现在位置:Python中文网/ 问答频道 /正文

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

def exec_statement(_cxn, _stmt):
    try:
        db_crsr = _cxn.cursor()
        db_crsr.execute(_stmt)
        _cxn.commit()
        db_crsr.close()
        return True
    except:
        return False

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

是否有方法获取受_cxn.commit()影响的多行?E、 g.对于一次插入,它总是1;对于一次删除或更新,受语句影响的行数等。?


Tags: 方法dbreturndefupdate语句deletepsycopg2
1条回答
网友
1楼 · 发布于 2024-03-28 14:50:52

无法使用commit()获取行计数,但可以在每次execute调用后使用cursor获取该信息。您可以使用其rowcount属性来获取受SELECTINSERTUPDATEDELETE影响的行数。

    db_crsr = _cxn.cursor()
    db_crsr.execute(_stmt)

    rowcount = db_crsr.rowcount

    _cxn.commit()
    db_crsr.close()

    return rowcount

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

-1可以在某些情况下(http://initd.org/psycopg/docs/cursor.html#cursor.rowcount)在非故障情况下返回,因此我建议不要使用该值作为故障指示器。如果您真的想在失败的情况下返回一个数值,那么返回一个像-10这样的数字可能会起作用(在except块中),因为rowcount不应该返回这个值。

相关问题 更多 >