with insertar ejemplo desde datos conexion python sqlite transactions sqlite3 commit

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.

https://code.google.com/p/apsw/


cursor=connection.cursor() cursor.executemany("insert into person(firstname, lastname) values (?, ?)", persons) connection.commit()