python - psycopg2 : cursor already closed

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

假设 q1 失败,SSL 连接意外关闭。然后我的其余查询也因 cursor already closed 而失败。我如何确保如果一个查询失败,则以下查询成功执行。

最佳答案

据推测,如果连接断开,您将需要重新建立它并在异常处理程序中获取另一个游标:

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(...) 在尝试重新建立连接时可能会失败,因此您也应该处理它。

关于python - psycopg2 : cursor already closed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35651586/

相关文章:

python - 使用 Fortran 读取二进制文件 - 如果没有提供输入列表,Fortran 会跳过多少字节?

postgresql - 存储后端如何影响 Datomic?

python - 带有 postgres 的游标,数据存储在哪里以及对数据库的调用次数

python - Postgres时间戳不接受2017-01-01T23 :00:00-00:00

python - 查询时间过长时 psycopg2 游标挂起

java - Hiveserver2无法启动: “ascii codec cant encode character”

python - 当列数是动态的时,如何从数据框中过滤数据?

python - 如何匹配此模式和字符串中的最后一个空格?

sql - 如何从选择查询中消除重复项?

php - Postgres 提取查询返回 bool 错误