psycopg2:游标已经关闭

时间:2016-02-26 12:20:27

标签: 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

假设q1SSL connection has been closed unexpectedly而失败。然后我的其余查询也会失败cursor already closed。如何确保如果一个查询失败,则可以成功执行以下查询。

2 个答案:

答案 0 :(得分:13)

大概如果连接断开,你需要重新建立它并在异常处理程序中获得另一个游标:

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

此处针对不存在的表尝试查询。引发ProgrammingError异常,如果要尝试另一个查询,则必须回滚连接。第二个查询应该会成功。

这掩盖了异常处理程序本身引发的进一步异常的细节,例如。connect(...)在尝试重新建立连接时可能会失败,所以你也应该处理它。

答案 1 :(得分:1)

如果在查询的较低级别出现问题,您应该明确地重新生成中的光标。

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