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

amp*_*ent 36 python psycopg2

目前,我有以下方法使用执行INSERT/UPDATE/DELETE语句psycopg2Python:

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

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

有没有办法让一些行受到影响_cxn.commit()?例如,对于单个INSERT,对于DELETE或UPDATE,它将始终为1,受语句影响的行数等?

kha*_*son 60

commit()不能用于获取行计数,但您可以cursor在每次execute调用后使用它来获取该信息.您可以使用它的rowcount属性来获得对受影响的行数SELECT,INSERT,UPDATEDELETE.

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

    rowcount = db_crsr.rowcount

    _cxn.commit()
    db_crsr.close()

    return rowcount
Run Code Online (Sandbox Code Playgroud)

如果要返回受影响行的数量,我建议不要捕获任何异常,因为如果操作真的失败(比如查询格式错误,或者存在FK约束违规等),则应该引发异常,在这种情况下,调用者可以捕获并按行动进行操作.(或者,如果您想集中异常处理,可能raise是自定义MyPostgresException或类似的.)

在某些情况下,可以在非失败的情况下返回-1(http://initd.org/psycopg/docs/cursor.html#cursor.rowcount),因此我建议不要将该值用作失败指示符.如果你真的想在失败的情况下返回一个数值,也许返回一个像-10这样的数字就行了(在except块中),因为rowcount不应该返回它.

  • 傻我 忘记`with`。=)我一生中需要更多的Python。 (2认同)