2012-05-05 127 views
1

我注意到python sqlite fetchall()和fetchmany()語句以排序的鍵順序而不是原始鍵順序返回結果。例如,考慮:python sqlite fetchmany和fetchall返回排序結果

list_indexes = [9, 5, 2, 8, 3, 7] 

indexsize = len(list_indexes) 
cursor.arraysize = indexsize 

cursor.execute("select index, details from this_table where index in (%s)" % ','.join('?' * len(list_indexes)), list_indexes) 
rows = cursor.fetchmany(indexsize) 

行的返回順序是按排序的鍵順序[2,3,5,7,8,9]。

我錯過了什麼,或者這是默認行爲?如果是這樣,是否有一個解決方法,除了明顯的一個重新排序參數索引的行?

回答

2

這是正常的行爲。除非在查詢中指定ORDER BY,否則結果中的行順序未定義。如果您有一些可用於排序的字段(例如日期),則應該使用它。

您可以使用臨時表來做到這一點,你想:

; prepare test table 
CREATE TABLE this_table (`index` INTEGER, record_details TEXT); 
INSERT INTO this_table VALUES (1, 'a1'); 
INSERT INTO this_table VALUES (2, 'a2'); 
; ... 
INSERT INTO this_table VALUES (10, 'a10'); 

; do the query 
CREATE TEMP TABLE good_indexes(number INTEGER, i integer); 
INSERT INTO good_indexes(number, i) VALUES (1, 4); 
INSERT INTO good_indexes(number, i) VALUES (2, 2); 
INSERT INTO good_indexes(number, i) VALUES (3, 6); 

SELECT record_details FROM this_table, good_indexes 
WHERE good_indexes.i = this_table.`index` ORDER BY good_indexes.number; 
; result: a4, a2, a6 

DROP TABLE good_indexes; 
+0

感謝澄清。關於解決方法,使用參數索引重新排序行更容易。 –