nis*_*ish 11 python postgresql psycopg2
我在用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
Run Code Online (Sandbox Code Playgroud)
假设q1失败了SSL connection has been closed unexpectedly.然后我的其余查询也失败了cursor already closed.如何确保如果一个查询失败,则可以成功执行以下查询.
mha*_*wke 15
假设连接已经丢失,您需要重新建立它并在异常处理程序中获取另一个游标:
for query in queries:
try:
cursor.execute(query)
except Exception as e:
print e.message
conn = psycopg2.connect(....)
cursor = conn.cursor()
Run Code Online (Sandbox Code Playgroud)
您应该更加具体地了解您捕获的例外情况.假设InterfaceError光标以某种方式关闭时会出现异常,您可以像这样捕获:
except psycopg2.InterfaceError as e:
Run Code Online (Sandbox Code Playgroud)
可能存在其他不太严重的问题,这些问题将阻止后续查询执行,例如,事务中止.在这种情况下,您需要回滚当前事务,然后尝试下一个查询:
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()
Run Code Online (Sandbox Code Playgroud)
这里针对不存在的表尝试查询.一个ProgrammingError例外被引发,并且连接必须回滚如果另一个查询被尝试.第二个查询应该成功.
这掩盖了异常处理程序本身引发的进一步异常的细节,例如,connect(...)在尝试重新建立连接时可能会失败,因此您也应该处理它.
您应该在 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()
Run Code Online (Sandbox Code Playgroud)