psycopg2:游标已经关闭
psycopg2 : cursor already closed
我正在使用 psycopg2 2.6.1
。我有一堆查询需要按顺序执行。
conn = psycopg2.connect(database=redshift_database,
user=redshift_user,
password=os.environ.get("PGPASSWORD"),
host=redshift_cluster,
port=redshift_port)
cursor = conn.cursor()
queries = [q1, q2, q3....] ## a list of queries
for query in queries:
try:
cursor.execute(query)
except:
print e.message
假设 q1
因 SSL connection has been closed unexpectedly
而失败。然后我的其余查询也因 cursor already closed
而失败。我如何确保如果一个查询失败,则以下查询成功执行。
您应该明确地重新生成 except 块中的游标,以防查询以下级别出现问题:
for query in queries:
try:
cursor.execute(query)
except:
print e.message
try:
cursor.close()
cursor = conn.cursor()
except:
conn.close()
conn = psycopg2.connect(...)
cursor = conn.cursor()
大概如果连接断开,您将需要重新建立它并在异常处理程序中获取另一个游标:
for query in queries:
try:
cursor.execute(query)
except Exception as e:
print e.message
conn = psycopg2.connect(....)
cursor = conn.cursor()
你应该更具体地说明你捕获的异常。假设 InterfaceError
异常,如果游标以某种方式关闭,您可以像这样捕获它:
except psycopg2.InterfaceError as e:
可能还有其他不太严重的问题会阻止后续查询的执行,例如交易中止。在这种情况下,您需要回滚当前事务,然后尝试下一个查询:
queries = ['select count(*) from non_existent_table', 'select count(*) from existing_table']
for query in queries:
try:
cursor.execute(query)
except psycopg2.ProgrammingError as exc:
print exc.message
conn.rollback()
except psycopg2.InterfaceError as exc:
print exc.message
conn = psycopg2.connect(....)
cursor = conn.cursor()
此处尝试针对不存在的 table 进行查询。引发 ProgrammingError
异常,如果要尝试另一个查询,则必须回滚连接。第二个查询应该会成功。
这掩盖了异常处理程序本身引发的更多异常的细节,例如connect(...)
在尝试重新建立连接时可能会失败,因此您也应该处理它。
我正在使用 psycopg2 2.6.1
。我有一堆查询需要按顺序执行。
conn = psycopg2.connect(database=redshift_database,
user=redshift_user,
password=os.environ.get("PGPASSWORD"),
host=redshift_cluster,
port=redshift_port)
cursor = conn.cursor()
queries = [q1, q2, q3....] ## a list of queries
for query in queries:
try:
cursor.execute(query)
except:
print e.message
假设 q1
因 SSL connection has been closed unexpectedly
而失败。然后我的其余查询也因 cursor already closed
而失败。我如何确保如果一个查询失败,则以下查询成功执行。
您应该明确地重新生成 except 块中的游标,以防查询以下级别出现问题:
for query in queries:
try:
cursor.execute(query)
except:
print e.message
try:
cursor.close()
cursor = conn.cursor()
except:
conn.close()
conn = psycopg2.connect(...)
cursor = conn.cursor()
大概如果连接断开,您将需要重新建立它并在异常处理程序中获取另一个游标:
for query in queries:
try:
cursor.execute(query)
except Exception as e:
print e.message
conn = psycopg2.connect(....)
cursor = conn.cursor()
你应该更具体地说明你捕获的异常。假设 InterfaceError
异常,如果游标以某种方式关闭,您可以像这样捕获它:
except psycopg2.InterfaceError as e:
可能还有其他不太严重的问题会阻止后续查询的执行,例如交易中止。在这种情况下,您需要回滚当前事务,然后尝试下一个查询:
queries = ['select count(*) from non_existent_table', 'select count(*) from existing_table']
for query in queries:
try:
cursor.execute(query)
except psycopg2.ProgrammingError as exc:
print exc.message
conn.rollback()
except psycopg2.InterfaceError as exc:
print exc.message
conn = psycopg2.connect(....)
cursor = conn.cursor()
此处尝试针对不存在的 table 进行查询。引发 ProgrammingError
异常,如果要尝试另一个查询,则必须回滚连接。第二个查询应该会成功。
这掩盖了异常处理程序本身引发的更多异常的细节,例如connect(...)
在尝试重新建立连接时可能会失败,因此您也应该处理它。