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

时间:2014-06-26 22:17:43

标签: python psycopg2

目前,我有以下方法使用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

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

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

1 个答案:

答案 0 :(得分:49)

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

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

    rowcount = db_crsr.rowcount

    _cxn.commit()
    db_crsr.close()

    return rowcount

如果要返回受影响的行数,我建议不要捕获任何异常,因为如果操作真的失败(比如查询格式错误,或者存在FK约束违规等),则应该例外被提升,在这种情况下,呼叫者可以抓住它并按照需要行事。 (或者,如果您想集中处理异常,可能是raise自定义MyPostgresException或类似的。)

在某些情况下(http://initd.org/psycopg/docs/cursor.html#cursor.rowcount),

-1可以在非失败的情况下返回,因此我建议不要将该值用作失败指示符。如果你真的想在失败的情况下返回一个数值,也许返回一个像-10这样的数字就行了(在except块中),因为rowcount不应该返回那个。