dav*_*ode 8 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)
Run Code Online (Sandbox Code Playgroud)
游标似乎有效,因为它可以迭代并返回预期的记录作为 python 字典,但是当我尝试关闭它 ( cursor.close()) 时,我得到了异常:
psycopg2 OperationalError: cursor *the generated cursor id* does not exist
Run Code Online (Sandbox Code Playgroud)
跆拳道?!那么我用来从数据库中检索内容的对象是什么?psycopg2 是否使用后备默认(未命名)游标,因为在我的数据库中找不到我定义的游标(如果是这样......我的大问题:在使用 psycopg2 之前必须在 db 级别定义游标?)很困惑,你能帮我吗?
use*_*948 21
我犯了一个非常简单和愚蠢的错误,忘记运行./manage.py makemigrations并./manage.py migrate在运行之前./manage.py test导致了这个错误。
(我知道这并没有回答原来的问题,但由于这是谷歌的第一个结果,我想我会做出贡献。希望没关系)
Dmi*_* P. 13
我有类似的问题并找到了解决方案。只需禁用服务器端光标,如下所述: 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,
...
},
Run Code Online (Sandbox Code Playgroud)
在使用我的模型并使用 Pytest 启动测试时,我遇到了这个问题。
对我来说解决问题的是重置我的测试单元的数据库。我使用 --create-db 像这样:
pytest backend/test_projects/partners/test_actions.py --create-db
Run Code Online (Sandbox Code Playgroud)
来自 psycopg2 文档:
“命名游标通常是在不保留的情况下创建的,这意味着它们仅在当前事务期间存在。尝试在 commit() 之后从命名游标获取数据或在连接事务隔离级别设置为 AUTOCOMMIT 时创建命名游标将导致在一个例外中。”
也就是说,这些游标不需要显式关闭。
http://initd.org/psycopg/docs/usage.html#server-side-cursors
| 归档时间: |
|
| 查看次数: |
14474 次 |
| 最近记录: |