psycopg2 每次执行都会产生不同的 table 并且光标不会滚动到开头

psycopg2 each execute yields different table and cursor not scrolling to the beginning

我正在通过 python 的 psycopg2 包查询 postgresql 数据库。

简而言之:问题是每次我 运行 一个 psydopg2.cursor.execute() 命令时,psycopg2.fetchmany() 都会产生不同的 table。

import psycopg2 as ps
conn = ps.connect(database='database', user='user')
nlines = 1000
tab = "some_table" 
statement= """ SELECT * FROM """ + tab + " LIMIT %d;" %(nlines)
crs.execute(statement)

然后我分段获取数据。 运行 以下执行得很好,每次当我滚动回到开头时,我都会得到相同的结果。

rec=crs.fetchmany(10)
crs.scroll(0, mode='absolute')
print rec[-1][-2]

但是,如果我再次 运行 crs.execute(statement) 然后获取数据,它会产生完全不同的输出。我再次尝试 运行ning ps.connect,执行 conn.rollback(), conn.reset(), crs.close(),但 table 的输出没有任何结果。我还尝试了启用可滚动的命名游标

crs= conn.cursor(name="cur1")
crs.scrollable=1
...
crs.scroll(0, mode= 'absolute')

仍然没有运气。

您的查询中没有任何 ORDER BY 子句,并且 Postgres 不保证没有任何特定的顺序。它特别有可能更改具有大量流失(即大量 inserts/updates/deletes)的表的顺序。

有关详细信息,请参阅 Postgres SELECT doc,但这里最突出的片段是:

If the ORDER BY clause is specified, the returned rows are sorted in the specified order. If ORDER BY is not given, the rows are returned in whatever order the system finds fastest to produce.

我不希望任何查询,无论使用的游标类型如何,都必然 return 给定此类查询的结果集完全相同。

添加显式 ORDER BY 会发生什么?