SQLite3如何从数据库中选择前100行,然后是下一个100

时间:2017-04-19 10:32:23

标签: python sqlite

目前我的数据库已经填满了1000行。

我想选择前100行,然后选择下一个100,然后选择下一个100,依此类推......

到目前为止,我有:

c.execute('SELECT words FROM testWords')
data = c.fetchmany(100)

这允许我获得前100行,但是,我无法使用另一个SELECT语句找到在此之后选择接下来的100行的语法。

我已经看到其他编码语言可以使用,但是还没有找到Python的SQLite3解决方案。

3 个答案:

答案 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