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

标签 python psycopg2

目前,我有以下方法在 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() 影响的行数?例如。对于单个 INSERT,它始终为 1,对于 DELETE 或 UPDATE,受语句影响的行数等?

最佳答案

commit() 不能用于获取行数,但您可以使用 cursor 在每次 execute 之后获取该信息> 打电话。您可以使用它的 rowcount 属性来获取 SELECTINSERTUPDATE 影响的行数>删除

    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 block 中),因为 rowcount 不应该永远返回那个。

关于python - 从 psycopg2 connection.commit() 获取受影响的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24441132/

相关文章:

python - python是否有相当于Javascript的 'btoa'

python - 未找到 Psycopg2 图像

python - postgres INSERT 命令的速度改进

python - Django:启动迁移到 heroku 时没有名为 'psycopg2' 的模块

python - XlsxWriter:根据 Excel 2016 设计指定绘图样式

python - 绑定(bind)自由套接字后是否必须使用 "unbind"套接字?

python - 通过 Selenium 使用 PhantomJS 进行测试时显示页面

python - 在 postgreSQL 上选择大写表名不起作用

amazon-ec2 - aws 上最新版本的 psycopg2

python - 使用 Flask-dance 和 Google oauth 获取 'Missing required parameter: refresh_token'