Sqlite python sqlite3.OperationalError: la base de datos está bloqueada

He escrito el siguiente código, que muestra el error sqlite3.OperationalError: database is locked . Cualquier ayuda para depurar sería muy apreciada.

Básicamente, estoy intentando copiar datos de table1 a table2 e insertar datos en table2 en función de los cambios ocurridos en table1 por alguna otra aplicación.

Parece que me falta alguna parte.

 import sqlite3 conn = sqlite3.connect("/home/sid/.Skype/testmasterut/main.db") cursor = conn.cursor() createLogTableSql = """create table IF NOT EXISTS sid_log as select id as "s_id",author as "s_author",timestamp as "s_timestamp",edited_by as "s_editedby",edited_timestamp as "s_edited_timestamp",body_xml as "s_body_xml" from Messages""" cursor.execute(createLogTableSql) conn.commit() print "Table to save the old messages has been created" selectLog = """ select * from sid_log """ original_table = cursor.execute(selectLog) cursor2 = conn.cursor() cursor3 = conn.cursor() cursor4 = conn.cursor() InsertTest = """ insert or ignore into sid_log (s_id,s_author,s_timestamp,s_editedby,s_edited_timestamp,s_body_xml) select id,author,timestamp,edited_by,edited_timestamp,body_xml from Messages where id not in (select s_id from sid_log where s_id = id) and edited_by is NULL and edited_timestamp is NULL """ EditedTest = """ select * from Messages where id in (select s_id from sid_log where s_id = id) and edited_by is not NULL and edited_timestamp is not NULL""" conn.close() while True: conn2 = sqlite3.connect("/home/sid/.Skype/testmasterut/main.db",timeout=3) conn2.execute(InsertTest) print "Total number of rows changed:", conn.total_changes EditedTest2 = """ select * from Messages where id in (select s_id from sid_log where s_id = id) and edited_by is not NULL and edited_timestamp is not NULL""" edited_list = conn2.execute(EditedTest2) conn2.commit() conn2.close() # for row in edited_list: # queryString = "SELECT * FROM sid_log WHERE s_id IN (%s)" % str(row[0]) # original_message = conn.execute(queryString) # for org_row in original_message: # print "Message edited from", org_row[5], "to", row[5] 

A continuación se muestra la traza

 Traceback (most recent call last): File "try2.py", line 28, in  conn2.execute(InsertTest) sqlite3.OperationalError: database is locked 

No estoy seguro de si esto ayudará a alguien, pero encontré una solución a mi propio problema de Base de datos bloqueada.

Uso PyCharm y descubrí que se estaban ejecutando varias instancias del script en el que estaba trabajando. Esto generalmente se debía a errores en el código que estaba probando, pero permaneció activo (y, por lo tanto, la conexión a la base de datos todavía estaba activa). Cierre esos (detenga todos los procesos) e inténtelo de nuevo: ¡siempre me ha funcionado!

Si alguien sabe una manera de hacer que se agote el tiempo de espera después de un rato, comente esta solución. Intenté cur.execute("PRAGMA busy_timeout = 30000") (que se encuentra en otro hilo en una pregunta similar) pero no parece hacer nada.

“La base de datos está bloqueada” significa que alguna otra conexión tiene una conexión activa.

Use PRAGMA busy_timeout para esperar un tiempo hasta que finalice la otra transacción:

 conn.execute("PRAGMA busy_timeout = 30000") # 30 s 

Sin embargo, si esa otra aplicación mantiene deliberadamente una transacción abierta para mantener la base de datos bloqueada, no hay nada que pueda hacer.

 cursor2 = conn.cursor() cursor3 = conn.cursor() cursor4 = conn.cursor() 

Creo que tiene que cerrar la conexión que ha abierto, puede que el error se deba a que ha abierto varias conexiones.

 cursor2 = conn.cursor() """EDIT YOUR DATABASE USING CODE AND CLOSE THE CONNECTION""" connection.close() cursor3 = conn.cursor() """EDIT YOUR DATABASE USING CODE AND CLOSE THE CONNECTION""" connection.close() cursor4 = conn.cursor() """EDIT YOUR DATABASE USING CODE AND CLOSE THE CONNECTION""" connection.close() 

Tuve el mismo problema, pero se resolvió cuando usé lo siguiente para cerrar las conexiones simultáneas.

 conn.close() 

Entonces, si tu progtwig comienza así:

 import sqlite3 conn = sqlite3.connect('pg_example.db', timeout=10) c = conn.cursor() 

Asegúrese de que está incluyendo conn.close () después de cada instrucción SQL

 t = ('RHAT',) c.execute('SELECT * FROM stocks WHERE symbol=?', t) conn.commit() conn.close() #This is the one you need