Navegando por las filas del cursor en SQLite (¿Podemos rebobinar / restablecer el cursor, es decir, volver a la primera fila, por ejemplo?)

Estoy tratando de entender cómo funcionan las siguientes funciones integradas cuando se procesan secuencialmente filas de cursores. Las descripciones provienen del manual de Python 3.1 (usando SQLite3)

Cursor.fetchone() 

Obtiene la siguiente fila de un conjunto de resultados de consulta, devolviendo una única secuencia.

 Cursor.fetchmany() 

Obtiene el siguiente conjunto de filas del resultado de una consulta, devolviendo una lista.

 Cursor.fetchall() 

Obtiene todas las filas (restantes) de un resultado de consulta, devolviendo una lista.

Entonces, si tengo un bucle en el que estoy procesando una fila a la vez usando cursor.fetchone (), y algún código posterior requiere que regrese a la primera fila, o busque todas las filas usando fetchall (), ¿cómo lo hago? ?

El concepto me resulta un poco extraño, especialmente al provenir de un fondo de Foxpro que tiene el concepto de un puntero de registro que se puede mover a la primera o última fila de un cursor (ir arriba / abajo), o ir a la enésima fila ( ir n)

Cualquier ayuda sería apreciada.

Alan

La interfaz SQLite en Python 3.1 se basa en PEP 249 , que solo especifica que los cursores deben admitir el acceso secuencial a los registros de un resultado de consulta. No hay manera de volver. Si necesita volver a una fila recuperada anteriormente, debe guardarla la primera vez que la busque, por ejemplo, cree una lista de los datos obtenidos (o, en realidad, simplemente use fetchall ). Luego puede trabajar con la lista y avanzar y retroceder entre las filas tanto como desee.

La idea detrás del diseño de la API DB es apoyar la ejecución eficiente de código donde solo necesita procesar cada fila una vez. Un bucle típico se ve así:

 for a,b,c in cursor.fetchone(): # process it 

De esta manera, el cursor puede descartar las referencias a los datos de cada fila una vez que finaliza la iteración correspondiente del bucle. Realmente no pierde nada porque si desea mantener todos los datos, siempre puede hacer una lista de ellos, pero las aplicaciones que tratan con grandes conjuntos de datos todavía tienen la capacidad de procesar filas una a la vez. Es como el razonamiento detrás del uso de expresiones generadoras en lugar de listas cuando necesita procesar elementos de uno iterable uno por uno.