Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从临时表一次获取n条记录_Python_Sql_Database_Postgresql - Fatal编程技术网

Python 从临时表一次获取n条记录

Python 从临时表一次获取n条记录,python,sql,database,postgresql,Python,Sql,Database,Postgresql,我有一个临时表,有大约100万个条目。临时表存储较大查询的结果。例如,我想一次处理1000条记录。设置查询的最佳方法是什么,这样我可以得到前1000行,然后是下1000行,以此类推。?它们不是天生有序的,但是临时表只有一个ID为的列,所以如果需要,我可以对它进行排序。我正在考虑用临时表创建一个额外的列来对所有行进行编号,例如: CREATE TEMP TABLE tmptmp AS SELECT ##autonumber somehow##, id FROM .... --complicated

我有一个临时表,有大约100万个条目。临时表存储较大查询的结果。例如,我想一次处理1000条记录。设置查询的最佳方法是什么,这样我可以得到前1000行,然后是下1000行,以此类推。?它们不是天生有序的,但是临时表只有一个ID为的列,所以如果需要,我可以对它进行排序。我正在考虑用临时表创建一个额外的列来对所有行进行编号,例如:

CREATE TEMP TABLE tmptmp AS
SELECT ##autonumber somehow##, id
FROM .... --complicated query
然后我可以做:

SELECT * FROM tmptmp WHERE autonumber>=0 AND autonumber < 1000
从tmptmp中选择*,其中自动编号>=0且自动编号<1000

等等。。。我该如何真正做到这一点?还是有更好的办法?我正在使用Python和PostgreSQL。

使用游标并获取所需的行。抵消当你有很多记录时,限制会变慢,光标会做得更好


也许您可以使用类似的方法(我们在批量更新+2000万行的表时使用,不想占用复制)

输出如下所示:

Max id: 308
2010-06-18 11:59:11.271000: Running query on range 0 to 49
2010-06-18 11:59:11.271000: Affected rows: 49. Total completed: 15.0%
2010-06-18 11:59:11.271000: Running query on range 50 to 99
2010-06-18 11:59:11.271000: Affected rows: 50. Total completed: 32.0%
2010-06-18 11:59:11.271000: Running query on range 100 to 149
2010-06-18 11:59:11.271000: Affected rows: 50. Total completed: 48.0%
2010-06-18 11:59:11.271000: Running query on range 150 to 199
2010-06-18 11:59:11.271000: Affected rows: 49. Total completed: 64.0%
2010-06-18 11:59:11.271000: Running query on range 200 to 249
2010-06-18 11:59:11.271000: Affected rows: 42. Total completed: 80.0%
2010-06-18 11:59:11.271000: Running query on range 250 to 299
2010-06-18 11:59:11.318000: Affected rows: 3. Total completed: 97.0%
2010-06-18 11:59:11.318000: Running query on range 300 to 349
2010-06-18 11:59:11.318000: Affected rows: 1. Total completed: 113.0%
Done.

//John

您可以指定是使用
pygresql
还是
psycopg2
…如果要创建一个包含一百万行的临时表,可能会有更好的方法,但是如果不知道这些表以及您试图实现的结果,很难说……尝试使用Postgres游标并限制开始、大小。如果你愿意,我可以详细说明。当然可以。从Python开始,我只需要做
cur.fetchmany(1000)
而不是
cur.fetchall()
heh.+1是的,这当然是更好的解决方案(不久将删除我的)。在Python中的符合
dbapi2
标准的数据库界面中,您确实要使用std
.execute(sql)
,然后是一系列
.fetchmany(1000)
,直到光标完全用完为止。
Max id: 308
2010-06-18 11:59:11.271000: Running query on range 0 to 49
2010-06-18 11:59:11.271000: Affected rows: 49. Total completed: 15.0%
2010-06-18 11:59:11.271000: Running query on range 50 to 99
2010-06-18 11:59:11.271000: Affected rows: 50. Total completed: 32.0%
2010-06-18 11:59:11.271000: Running query on range 100 to 149
2010-06-18 11:59:11.271000: Affected rows: 50. Total completed: 48.0%
2010-06-18 11:59:11.271000: Running query on range 150 to 199
2010-06-18 11:59:11.271000: Affected rows: 49. Total completed: 64.0%
2010-06-18 11:59:11.271000: Running query on range 200 to 249
2010-06-18 11:59:11.271000: Affected rows: 42. Total completed: 80.0%
2010-06-18 11:59:11.271000: Running query on range 250 to 299
2010-06-18 11:59:11.318000: Affected rows: 3. Total completed: 97.0%
2010-06-18 11:59:11.318000: Running query on range 300 to 349
2010-06-18 11:59:11.318000: Affected rows: 1. Total completed: 113.0%
Done.