2017-04-19 23 views
-1

目前我有数据库充满了1000行。SQLite3如何从数据库中选择第一个100行,然后选择下一个100

我要选择的前100行,然后选择下一个100,那么接下来的100等等...

到目前为止,我有:

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

这让我获得前100行,但是,我找不到使用另一个SELECT语句选择接下来的100行的语法。

我已经看到它可能与其他编码语言,但还没有找到与Python的SQLite3解决方案。

+1

那么当你再次调用'c.fetchmany(100)'*时发生了什么? –

回答

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') 
+0

此外,'c.fetchmany()'意味着被重复调用,每次调用它时都会在同一个游标上返回下一批。 –

0

你可以箱子迭代,并调用它多次:

def ResultIter(cursor, arraysize=100): 
    while True: 
     results = cursor.fetchmany(arraysize) 
     if not results: 
      break 
     for result in results: 
      yield result 
1

当您使用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 

如果你不能保持光标(说的保持,因为你所服务的Web请求),然后使用cursor.fetchmany()是错误的接口。您将不得不通过SELECT语句仅使用LIMIT syntax返回选定的行窗口。 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值传递给下一个调用你的代码,如果你以后需要在其他地方,然后把这些批次的简历。

相关问题