目前,我有以下方法使用执行INSERT/UPDATE/DELETE语句psycopg2中Python:
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,UPDATE和DELETE.
即
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不应该返回它.