2017-04-19 51 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值傳遞給下一個調用你的代碼,如果你以後需要在其他地方,然後把這些批次的簡歷。

相關問題