insertar - sqlite conexion python
Python/SQLite3: no se puede confirmar; ninguna transacción está activa (3)
Bueno, como suele suceder, encontré la solución solo unos minutos después de plantear la pregunta.
La solución se encontró aquí y consiste en la única idea:
Nunca utilice BEGIN / COMMIT en modo no autocommit en la aplicación Python. ¡Utilice db.commit () y db.rollback () solamente!
Suena extraño, pero funciona.
Estoy intentando codificar un indexador de libros usando Python (tradicional, 2.7) y SQLite (3).
El código se reduce a esta secuencia de declaraciones SQL:
''select count(*) from tag_dict'' ()
/* [(30,)] */
''select count(*) from file_meta'' ()
/* [(63613,)] */
''begin transaction'' ()
''select id from archive where name=?'' (''158326-158457.zip'',)
/* [(20,)] */
''select id from file where name=? and archive=?'' (''158328.fb2'', 20)
/* [(122707,)] */
''delete from file_meta where file=?'' (122707,)
''commit transaction'' ()
# error: cannot commit - no transaction is active
El nivel de aislamiento es ''DIFERIDO'' (''EXCLUSIVO'' no es mejor).
Intenté usar connection.commit () en lugar de cursor.execute (''commit''), no sucedió nada útil.
- Claro, he buscado Stackoverflow y la red, pero las respuestas encontradas son irrelevantes.
- El modo de confirmación automática es inaceptable por razones de rendimiento.
- Uso el único archivo de base de datos a la vez.
- Mi código se ejecuta en un solo hilo.
- Toda la ejecución de SQL se realiza a través de una sola función que garantiza que no tengo más que un solo cursor abierto a la vez.
Entonces, ¿qué pasa con la transacción aquí?
Si utilizo connection.commit () (nota: ¡no existe ningún método de conexión!), Simplemente pierdo mis datos.
Claro, he revisado los permisos de archivos doou / triple / quaruple en el archivo de base de datos y su directorio.
Bueno, como suele suceder, encontré la solución solo unos minutos después de plantear la pregunta.
Como novato, no puedo expresar mi propia pregunta por 8 horas ... Entonces, el anwer está ahora allí:
La solución se encontró aquí y consiste en la única idea:
Nunca use BEGIN / COMMIT en el modo no autocommit en la aplicación Python. ¡Utilice db.commit () y db.rollback () solamente!
Suena extraño, pero funciona.
Esta es una respuesta bastante tardía, pero tal vez eche un vistazo a APSW si desea un control más fino sobre las transacciones. Realicé algunas pruebas sobre transacciones diferidas que implicaban lecturas en pysqlite, y parece que no funcionan correctamente.
cursor=connection.cursor()
cursor.executemany("insert into person(firstname, lastname) values (?, ?)", persons)
connection.commit()