11

我正在尝试实现一个服务器端游标,以便在从数据库中获取大量数据时“绕过”Django ORM 的弱点。但我不明白应该如何定义命名游标,因为我当前的代码似乎无法正常工作。我以这种方式定义光标:

id = 'cursor%s' % uuid4().hex
connection = psycopg2.connect('my connection string here')
cursor = connection.cursor(id, cursor_factory=psycopg2.extras.RealDictCursor)

游标似乎可以迭代并以python字典的形式返回预期的记录,但是当我尝试关闭它时(cursor.close())我得到了异常:

psycopg2 OperationalError: cursor *the generated cursor id* does not exist

怎么回事?!那么我用来从数据库中检索内容的对象是什么?psycopg2 是否使用回退默认(未命名)游标,因为在我的数据库中找不到我定义的游标(如果是这样......我的大问题:在使用 psycopg2 之前必须在 db 级别定义游标?)我是很困惑,你能帮帮我吗?

4

4 回答 4

8

我有类似的问题并找到了解决方案。只需禁用此处描述的服务器端光标:https ://docs.djangoproject.com/en/2.2/ref/settings/#disable-server-side-cursors

        'default': {
            ...
            'USER': DB_USER,
            'PASSWORD': DB_PASSWORD,
            'NAME': DB_NAME,
            'DISABLE_SERVER_SIDE_CURSORS': True,
            ...
        },
于 2021-03-12T04:49:35.530 回答
8

在使用我的模型并使用 Pytest 启动测试时,我遇到了这个问题。

为我解决问题的是重置我的测试单元的数据库。我像这样使用--create-db:

pytest backend/test_projects/partners/test_actions.py --create-db
于 2018-04-25T19:45:53.420 回答
7

我犯了一个非常简单而愚蠢的错误,即在运行之前忘记运行./manage.py makemigrations并导致此错误。./manage.py migrate./manage.py test

(我知道这不能回答最初的问题,但由于这是谷歌的第一个结果,我认为我会做出贡献。希望没关系)

于 2021-03-31T00:03:28.063 回答
4

从 psycopg2 文档中:

“命名游标通常是在不HOLD的情况下创建的,这意味着它们的生存时间与当前事务一样长。尝试在commit()之后从命名游标获取或在连接事务隔离级别设置为AUTOCOMMIT时创建命名游标将导致在一个例外。”

也就是说这些游标不需要显式关闭。

http://initd.org/psycopg/docs/usage.html#server-side-cursors

于 2013-09-28T18:24:48.687 回答