如何在django和psycopg2中使用服务器端游标?[英] How can I use server-side cursors with django and psycopg2?

本文是小编为大家收集整理的关于如何在django和psycopg2中使用服务器端游标?的处理方法,想解了如何在django和psycopg2中使用服务器端游标?的问题怎么解决?如何在django和psycopg2中使用服务器端游标?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我正在尝试在psycop2中使用服务器端光标,如此博客文章.本质上,这是通过

实现的
from django.db import connection

if connection.connection is None:
    cursor = connection.cursor()
    # This is required to populate the connection object properly

cursor = connection.connection.cursor(name='gigantic_cursor')

执行查询时:

cursor.execute('SELECT * FROM %s WHERE foreign_id=%s' % (table_name, id))

我得到ProgrammingError:

psycopg2.ProgrammingError: can't use a named cursor outside of transactions

我天真地尝试使用

创建交易
cursor.execute('BEGIN')

执行SELECT语句之前.但是,这会导致从cursor.execute('BEGIN')线产生的相同错误.

我也尝试使用

cursor.execute('OPEN gigantic_cursor FOR SELECT * FROM %s WHERE foreign_id=%s' % (table_name, id))

但是我得到了相同的结果.

如何在Django中进行交易?

推荐答案

正如您在问题中提到的那样,我将在此处重申未来的读者:也可以在不绕过Django的公共API的情况下明确使用光标:

from django.db import connection, transaction

with transaction.atomic(), connection.cursor() as cur:
    cur.execute("""
        DECLARE mycursor CURSOR FOR
        SELECT *
        FROM giant_table
    """)
    while True:
        cur.execute("FETCH 1000 FROM mycursor")
        chunk = cur.fetchall()
        if not chunk:
            break
        for row in chunk:
            process_row(row)

其他推荐答案

光标应在交易中使用.您需要定义交易并使用它内部的光标.

- 需要进行交易才能使用光标.

取自在这里

其他推荐答案

我在我的isolation_level='AUTOCOMMIT'中得到了sqlalchemy.create_engine.

本文地址:https://www.itbaoku.cn/post/1763771.html