目前我的数据库已经填满了1000行。
我想选择前100行,然后选择下一个100,然后选择下一个100,依此类推......
到目前为止,我有:
c.execute('SELECT words FROM testWords')
data = c.fetchmany(100)
这允许我获得前100行,但是,我无法使用另一个SELECT
语句找到在此之后选择接下来的100行的语法。
我已经看到其他编码语言可以使用,但是还没有找到Python的SQLite3解决方案。
答案 0 :(得分:6)
当您使用cursor.fetchmany()
时,您不必发出另一个SELECT
声明。光标跟踪您在一系列结果中的位置,您需要做的就是再次调用c.fetchmany(100)
,直到产生空结果:
c.execute('SELECT words FROM testWords')
while True:
batch = c.fetchmany(100)
if not batch:
break
# each batch contains up to 100 rows
或使用iter()
function(可用于重复调用函数,直到达到哨兵结果):
c.execute('SELECT words FROM testWords')
for batch in iter(lambda: c.fetchmany(100), []):
# each batch contains up to 100 rows
如果你不能保持光标(例如,因为你正在提供网络请求),那么使用cursor.fetchmany()
是错误的界面。您必须使用LIMIT
syntax告诉SELECT
语句仅返回选定的行窗口。 LIMIT
有一个可选的OFFSET
关键字,这两个关键字一起指定要开始的行和要返回的行数。
请注意,您需要确保SELECT
语句已订购,以便获得稳定的结果集,然后您可以切片批量处理。
batchsize = 1000
offset = 0
while True:
c.execute(
'SELECT words FROM testWords LIMIT ? OFFSET ?',
(batchsize, offset))
batch = list(c)
offset += batchsize
if not batch:
break
如果您需要将这些批次发送到其他地方,然后稍后恢复,请将offset
值传递给您的代码的下一次调用。
答案 1 :(得分:0)
sqlite3与Python无关。它是一个独立的数据库; Python只提供了一个接口。
作为普通数据库,sqlite支持标准SQL。在SQL中,您可以使用LIMIT和OFFSET来确定查询的开始和结束。请注意,如果这样做,您应该使用显式的ORDER BY子句,以确保在查询之间一致地排序结果。
c.execute('SELECT words FROM testWords ORDER BY ID LIMIT 100')
...
c.execute('SELECT words FROM testWords ORDER BY ID LIMIT 100 OFFSET 100')
答案 2 :(得分:0)
您可以创建迭代器并多次调用它:
def ResultIter(cursor, arraysize=100):
while True:
results = cursor.fetchmany(arraysize)
if not results:
break
for result in results:
yield result