从 psycopg2 connection.commit() 获取受影响的行数

问题描述 投票:0回答:1

目前,我有以下方法使用

psycopg2
中的
Python
执行 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

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

有没有办法获得受

_cxn.commit()
影响的行数?例如。对于单个 INSERT 它将始终为 1,对于 DELETE 或 UPDATE,受语句影响的行数等?

python psycopg2
1个回答
116
投票

commit()
不能用于获取行数,但您可以在每次
cursor
调用后使用
execute
获取该信息。您可以使用其
rowcount
属性来获取
SELECT
INSERT
UPDATE
DELETE
受影响的行数。

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

    rowcount = db_crsr.rowcount

    _cxn.commit()
    db_crsr.close()

    return rowcount

如果您想返回受影响的行数,我建议不要捕获任何异常,因为如果操作确实失败(例如查询格式错误,或者存在 FK 约束违规等),则应该引发异常,在这种情况下,调用者可以捕捉到这一点并按照期望的方式行事。 (或者,如果您想集中异常处理,也许可以使用

raise
自定义
MyPostgresException
或类似的。)

在某些情况下,

-1 可以在非失败情况下返回(https://www.psycopg.org/docs/cursor.html#cursor.rowcount),因此我建议不要使用该值作为失败指标。如果您确实想在失败时返回一个数值,也许返回一个像 -10 这样的数字会起作用(在

except
块中),因为
rowcount
不应该返回该值。

© www.soinside.com 2019 - 2024. All rights reserved.