psycopg2 OperationalError:游标不存在

时间:2013-09-28 17:28:31

标签: python django postgresql psycopg2

我正在尝试实现服务器端游标,以便在从数据库中获取大量数据时“绕过”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

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

4 个答案:

答案 0 :(得分:2)

来自psycopg2文档:

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

这就是说这些游标不需要明确关闭。

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

答案 1 :(得分:2)

我遇到了类似的问题并找到了解决方案。只需禁用服务器端游标,如下所述: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,
            ...
        },

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

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

解决了我的问题是重置我的测试单元的数据库。我使用了--create-db,如此:

pytest backend/test_projects/partners/test_actions.py --create-db