我注意到Python sqlite fetchall()和fetchmany()语句以排序键顺序而不是原始键顺序返回结果。例如,考虑:
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]。
我错过了什么或这是默认行为吗?如果是这样,除了通过参数索引重新排序行之外,还有一种解决方法吗?
答案 0 :(得分: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;