gpt4 book ai didi

postgresql - Python3 中 psycopg2 游标的问题

转载 作者:行者123 更新时间:2023-11-29 13:30:53 27 4
gpt4 key购买 nike

我正在将 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)
except:
print('ERROR')

try:
connecter.cursor.execute(query_get_dbs_right)
except:
print('ERROR')

使用此代码,我在控制台中收到两条消息“ERROR”,难道我不应该只收到一条消息吗?尽管第一个错误,但我需要管理第二个工作。我尝试关闭游标并重新打开它,但问题仍然存在。

有什么想法吗?提前谢谢你。

解决方案

将此行添加到每个查询的异常代码的任何部分:

connecter.rollback()

最佳答案

if I make two queries in a row and the first one is wrong, the second one fails in spite of being right [snip]. With this code I get two messages 'ERROR' in console, shouldn't I get only one?

与 Python 3 无关。

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

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

关于postgresql - Python3 中 psycopg2 游标的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23825501/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com