1

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] です。

何か見逃したことがありますか、それともこれがデフォルトの動作ですか? もしそうなら、引数のインデックスで行を再ソートするという明らかな回避策とは別の回避策はありますか?

4

1 に答える 1

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;
于 2012-05-05T14:41:39.827 に答える