Examinar y luego actualizar las filas en sqlite con Python

Decidí que no me gusta el archivo automático y el cambio de nombre provisto por Mendeley , pero he encontrado que hace un seguimiento de todo en una base de datos sqlite que puedo leer y modificar fácilmente desde Python.

Mi pregunta es, si voy a recorrer en iteración las filas de una tabla que contiene rutas de archivos y hashes que sirven como identificadores que se usan en otras partes de la base de datos, ¿cuál es un patrón apropiado para actualizar las rutas a medida que avanzo? , compruebe si es necesario cambiar el nombre del archivo y, a continuación, desee actualizar la fila en la base de datos a medida que muevo el archivo.

Comencé a armar algo de Python para hacer esto, pero me parece que probablemente necesito hacer una consulta por adelantado para obtener todas las filas a las que iré más tarde, y luego hacer REEMPLAZO o ACTUALIZAR las sentencias de los archivos que ‘ He decidido mudarme.

No estoy familiarizado con las partes internas del módulo sqlite3, pero supongo que sería una mala idea hacer REEMPLAZAR / ACTUALIZAR mientras se repite en el cursor utilizado para la selección original.

¿Hay alguna otra forma de hacer esto que no requiera volver atrás con REEMPLAZAR / ACTUALIZAR? Necesito hacer consultas de otras tablas, usando el hash del archivo para obtener algunos otros metadatos para construir el cambio de nombre.

No creo que haya una manera de modificar las filas en la tabla que no sea a través de SQL – ACTUALIZAR, o INSERTAR O REEMPLAZAR. (Es tentador pensar que el objeto sqlite3.Row puede permitir la asignación y escribir de nuevo en la fila que representa, pero no).

En cuanto a hacer ACTUALIZACIONES (a través de un segundo cursor) mientras se usa un cursor destacado para el SELECT original, usted pregunta si es una mala idea. No sé si le preocupa la corrección o el rendimiento (corrección: la el cursor se confunde y no itera todas las filas que debería exactamente una vez; rendimiento: el cursor itera todas las filas que debería exactamente una vez, pero hay un montón de consultas adicionales costosas)?

Corrección de WRT, esto parece funcionar bien. Acabo de hacer una prueba rápida donde creé dos cursores, c1 y c2, luego en c1 ejecuté un comando SELECT, luego en c2 ejecuté un comando UPDATE que afectaba a las mismas filas, luego miré resultado de c1.fetchall (). Todavía contenía todas las filas correctas, aunque los datos en la primera fila estaban obsoletos (probablemente se obtuvieron con la consulta inicial) y los datos en las filas posteriores se actualizaron (probablemente solo se obtuvieron con el fetchall después de la actualización).

(Además, si la ACTUALIZACIÓN en c2 afecta a qué registros devolvería SELECT en c1, dichos registros ya no se recuperarán, pero obviamente todo lo que ya se recuperó ya fue recuperado, y nuevamente el cursor.execute () parece buscar el primero registre inmediatamente, por lo tanto, utilizando el mismo orden de comando que el anterior y con un comando ACTUALIZAR que haría que el SELECT original no encontrara nada, el c1.fetchall () posterior aún devuelve un registro.)

En cuanto al rendimiento, no lo sé: en el párrafo anterior me parece que tiene que repetir la consulta, lo que puede o no ser costoso según la consulta. (Puede que no se repita literalmente; quizás este trabajo se aplace hasta el scope real de todos modos).

Historia corta: no creo que haya otra manera de hacer esto sin ACTUALIZAR o REEMPLAZAR, y creo que funcionará bien hacer esas ACTUALIZACIONES incluso mientras se está iterando en el cursor original.