Postgresql Python3中psycopg2游标的问题
我将psycopg2与Python3一起使用,我刚刚意识到,如果我在一行中进行两个查询,并且第一个查询是错误的,那么第二个查询即使是正确的,也会失败。以下是一个例子:Postgresql Python3中psycopg2游标的问题,postgresql,python-3.x,psycopg2,Postgresql,Python 3.x,Psycopg2,我将psycopg2与Python3一起使用,我刚刚意识到,如果我在一行中进行两个查询,并且第一个查询是错误的,那么第二个查询即使是正确的,也会失败。以下是一个例子: query_get_dbs_wrong = ( 'SELECT * ' 'FOM pg_database;' ) query_get_dbs_right = ( 'SELECT * ' 'FROM pg_database;' ) try: connecter.cursor.execute(
query_get_dbs_wrong = (
'SELECT * '
'FOM pg_database;'
)
query_get_dbs_right = (
'SELECT * '
'FROM pg_database;'
)
try:
connecter.cursor.execute(query_get_dbs_wrong)
except:
print('ERROR')
try:
connecter.cursor.execute(query_get_dbs_right)
except:
print('ERROR')
使用此代码,我在控制台中收到两条消息“ERROR”,我不应该只收到一条吗?我需要管理第二个工作,尽管第一个是错误的。我试图关闭光标并重新打开它,但问题仍然存在
有什么想法吗?先谢谢你
解决方案
将此行添加到每个查询的异常代码的任何部分:
connecter.rollback()
如果我连续提出两个查询,而第一个查询是错误的,那么第二个查询尽管是正确的,但仍然会失败[snip]。使用此代码,我在控制台中收到两条消息“ERROR”,我不应该只收到一条吗
与Python3无关
psycopg2
默认为自动提交关闭。因此,当您运行第一个命令时,它会打开一个事务。当抛出第一个错误时,此事务进入中止状态。由于您没有对事务执行任何显式的ROLLBACK
,因此第二个命令失败,并出现一个错误,指示事务已经中止
您错误地认为捕获Python异常意味着数据库事务也可以忽略错误并继续。事实并非如此。您必须显式回滚事务(请参阅连接
对象上的事务控制方法)并开始新的事务。或者您可以使用SAVEPOINT
s,并在出现错误时使用ROLLBACK TO SAVEPOINT
,但请注意,这会导致数据库性能下降。在此之前,我想您已经回答了我一些问题。再次感谢你!我将用Python中的代码编辑这个问题。