Python3中psycopg2游标的问题

时间:2014-05-23 09:24:32

标签: postgresql python-3.x psycopg2

我在Python3中使用psycopg2,我刚刚意识到,如果我连续发出两个查询而第一个查询错误,那么第二个查询就会失败,尽管是正确的。这是一个例子:

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()

1 个答案:

答案 0 :(得分:1)

  

如果我连续发出两个查询并且第一个查询错误,则第二个查询失败,尽管它是正确的[剪切]。使用此代码,我收到两条消息' ERROR'在控制台中,我不应该只有一个吗?

与Python 3无关。

psycopg2默认为自动提交。因此,当您运行第一个命令时,它会打开一个事务。当抛出第一个ERROR时,此事务进入中止状态。由于您未对事务执行任何显式ROLLBACK,因此第二个命令失败并显示错误,指示事务已中止。

您错误地认为捕获Python异常意味着数据库事务也可以忽略错误并恢复。不是这种情况。您必须显式地回滚事务(请参阅connection对象上的事务控制方法)并开始一个新事务。或者您可以在出错时使用SAVEPOINTROLLBACK TO SAVEPOINT - 但请注意,这会导致数据库中的性能下降。