Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql Python3中psycopg2游标的问题_Postgresql_Python 3.x_Psycopg2 - Fatal编程技术网

Postgresql Python3中psycopg2游标的问题

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(

我将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()
如果我连续提出两个查询,而第一个查询是错误的,那么第二个查询尽管是正确的,但仍然会失败[snip]。使用此代码,我在控制台中收到两条消息“ERROR”,我不应该只收到一条吗

与Python3无关

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


您错误地认为捕获Python异常意味着数据库事务也可以忽略错误并继续。事实并非如此。您必须显式回滚事务(请参阅
连接
对象上的事务控制方法)并开始新的事务。或者您可以使用
SAVEPOINT
s,并在出现错误时使用
ROLLBACK TO SAVEPOINT
,但请注意,这会导致数据库性能下降。

在此之前,我想您已经回答了我一些问题。再次感谢你!我将用Python中的代码编辑这个问题。