- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
来自 psycopg2 文档:
When a database query is executed, the Psycopg cursor usually fetches all the records returned by the backend, transferring them to the client process. If the query returned an huge amount of data, a proportionally large amount of memory will be allocated by the client. If the dataset is too large to be practically handled on the client side, it is possible to create a server side cursor.
我想查询一个可能包含数千行的表,并对每一行执行一些操作。普通游标真的会把整个数据集带到客户端吗?这听起来不太合理。代码大致如下:
conn = psycopg2.connect(url)
cursor = conn.cursor()
cursor.execute(sql)
for row in cursor:
do some stuff
cursor.close()
我希望这是一个流操作。第二个问题是关于游标的范围。在我的循环中,我想更新另一个表。我是否需要每次都打开一个新游标并关闭?每个项目更新都应该在其自己的事务中,因为我可能需要进行回滚。
for row in cursor:
anotherCursor = anotherConn.cursor()
anotherCursor.execute(update)
if somecondition:
anotherConn.commit()
else:
anotherConn.rollback
cursor.close()
======== 编辑:我对第一部分的回答 ========
好的,我将尝试回答问题的第一部分。普通游标实际上会在您调用 execute 时立即带入整个数据集,甚至在开始迭代结果集之前。您可以通过在每个步骤检查进程的内存占用来验证这一点。但是服务器端游标的需要实际上是由于 postgres 服务器而不是客户端,并且在此处记录:http://www.postgresql.org/docs/9.3/static/sql-declare.html
现在,这并不能从文档中立即看出,但实际上可以在事务期间临时创建此类游标。无需使用特定的 SLQ 语句等在数据库中显式创建返回 refcursor 的函数。使用 psycopg2,您只需在获取游标时提供名称,将为该事务创建一个临时游标。所以不是:
cursor = conn.cursor()
你只需要:
cursor = conn.cursor('mycursor')
就是这样,它起作用了。我假设在设置 fetchSize 时使用 JDBC 时在幕后完成了同样的事情。它只是更透明一点。请在此处查看文档:https://jdbc.postgresql.org/documentation/head/query.html#query-with-cursor
您可以通过查询同一事务内的 pg_cursors View 来测试它是否有效。服务器端游标在获取客户端游标后出现,在关闭客户端游标后消失。所以底线:我很高兴对我的代码进行更改,但我必须说,对于没有 postgres 经验的人来说,这是一个很大的问题。
最佳答案
其实,你已经回答了问题;)。
来自文档:
CREATE FUNCTION reffunc(refcursor) RETURNS refcursor AS $$
BEGIN
OPEN $1 FOR SELECT col FROM test;
RETURN $1;
END;
$$ LANGUAGE plpgsql;
在代码中:
cur1 = conn.cursor()
cur1.callproc('reffunc', ['curname'])
cur2 = conn.cursor('curname')
for record in cur2: # or cur2.fetchone, fetchmany...
# do something with record
pass
关于Python psycopg2 游标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30427445/
目前,我正在尝试配置 Django 以在项目中使用,并且在尝试运行 python manage.py syncdb 时遇到持续错误。 File "/x/x/x/x/x/x/base.py", line
sqlite 的 Python db-api 实现有一个方便的方法 executescript() 来执行多语句 SQL 脚本。它对于创建数据库非常有用。参见 sqlite driver docume
我有一个时间戳,我正在尝试使用 psycopg 将其插入到 postgres 中,但我无法解决问题,我认为这是因为我正在尝试使用 python 的字符串格式将日期放入正确的位置。我有这样的东西 val
我试图生成一些有效的 Postgresql 语句,但是 cursor.execute 方法以一种奇怪的方式解释我的参数。 这是我的代码切割: for key in data_dict.keys():
我在尝试插入数据库时遇到了问题: ur_psql.execute("""insert into smth(data, filedate, filedby)""" "
已结束。此问题不符合 Stack Overflow guidelines .它目前不接受答案。 关闭 9 年前。 有关您编写的代码问题的问题必须在问题本身中描述具体问题——并包含有效代码以重现它。见
我们使用一个对象来保持与 PostgreSQL 数据库的连接并创建新的游标来处理请求。我观察到奇怪的行为:即使读取响应并关闭游标,请求仍然卡在数据库中,阻止更新表等。 当连接关闭时,它就消失了。 我了
我在更改我的 postgres 数据库中的表时遇到了一些问题。我正在使用 psycopg2 并使用 Python。我试图添加一个串行主键。它花了很长时间(大表),并且没有抛出任何错误,所以它做了一些事
当使用 psycopg 连接到 postgresql 数据库时,我拉了网线,没有出现任何错误。我如何在代码中检测到这一点以通知用户? 最佳答案 psycopg 无法检测到网络发生了什么。例如,如果您拔
我不断收到这个 error: psycopg2.ProgrammingError: column "someentry" does not exist. 当 someentry 不是列时,错误表明 s
我是 python 的初学者。我们使用这段代码来执行 SQL 命令。 cur.execute("INSERT INTO test (num, data) VALUES (%s, %s)", (100,
我正在处理 Udacity 的在线项目。我正在使用他们配置的 vagrant 来运行包含数据库的服务器。不幸的是,当我试图赋予代码持久性时,服务器每次都会返回错误。我是 python 的新手,所以请原
我用psycopg2创建数据库失败,语法错误,但在前几行使用相同的语法是行得通的,为什么要问?两行代码,为什么是第二行语法错误? [代码] db_name = 'series_id' self._cu
这个问题在这里已经有了答案: ValueError: operation parameter must be str or unicode (1 个回答) 关闭 4 年前。 我最近修改了我的插入查询
如何修复 Python 中的 SQL 语句? 数据库连接有效。但是,cur.execute 返回 none,这是错误的。 我的代码 import os, pg, sys, re, psycopg2 t
我正在尝试运行这样的代码: query = "copy (select email from my_table) TO 'STDOUT' WITH (FORMAT csv, DELIMITER '|
在 OSX Mojave 上安装了 Python3 和 Postgres 11.3,运行 pip install psycopg2 并收到以下冗长的错误消息。 据我所知,满足 psycopg 的要求,
有没有办法让 psycopg 和 postgres 无需重新建立连接就可以处理错误,比如 MySQLdb?下面的注释版本适用于 MySQLdb,注释使其适用于 Psycopg2: results =
我收到了一个来自野外的 unicode 字符串,它导致我们的一些 psycopg2 语句失败。 我已将问题简化为 SSCE: import psycopg2 conn = psycopg2.conne
我正在尝试在 Windows(Windows 7、64 位)下安装 psycopg2。我正在使用 Python 2.7.2 from Python(x,y)和 PostgreSQL 9.2.1。 我的
我是一名优秀的程序员,十分优秀!