sqlite> DELETE FROM mails WHERE (`id` = 71);
SQL error: database is locked
Comment puis-je déverrouiller la base de données pour que cela fonctionne ?
sqlite> DELETE FROM mails WHERE (`id` = 71);
SQL error: database is locked
Comment puis-je déverrouiller la base de données pour que cela fonctionne ?
Ce lien résout le problème : Quand Sqlite donne : Database locked error Cela a résolu mon problème et peut vous être utile.
Et vous pouvez utiliser begin transaction et end transaction pour ne pas verrouiller la base de données à l'avenir.
J'ai rencontré ce même problème sur Mac OS X 10.5.7 en exécutant Python scripts à partir d'une session terminal. Même si j'avais arrêté le scripts et que la fenêtre du terminal était assise à l'invite de commande, elle donnait cette erreur à la prochaine exécution. La solution consistait à fermer la fenêtre du terminal, puis à la rouvrir. Cela n'a pas de sens pour moi, mais cela a fonctionné.
Avant de choisir l'option de redémarrage, il est utile de voir si vous pouvez trouver l'utilisateur de la base de données sqlite.
Sous Linux, on peut utiliser fuser
à cette fin :
$ fuser database.db
$ fuser database.db-journal
Dans mon cas, j'ai obtenu la réponse suivante :
philip 3556 4700 0 10:24 pts/3 00:00:01 /usr/bin/python manage.py shell
Ce qui a montré que j'avais un autre programme Python avec le pid 3556 (manage.py) utilisant la base de données.
J'ai eu le même problème. Apparemment, la fonction de retour en arrière semble écraser le fichier db avec le journal qui est le même que le fichier db mais sans la modification la plus récente. J'ai implémenté cela dans mon code ci-dessous et cela fonctionne bien depuis, alors qu'avant mon code restait bloqué dans la boucle car la base de données restait verrouillée.
J'espère que cela vous aidera
##############
#### Defs ####
##############
def conn_exec( connection , cursor , cmd_str ):
done = False
try_count = 0.0
while not done:
try:
cursor.execute( cmd_str )
done = True
except sqlite.IntegrityError:
# Ignore this error because it means the item already exists in the database
done = True
except Exception, error:
if try_count%60.0 == 0.0: # print error every minute
print "\t" , "Error executing command" , cmd_str
print "Message:" , error
if try_count%120.0 == 0.0: # if waited for 2 miutes, roll back
print "Forcing Unlock"
connection.rollback()
time.sleep(0.05)
try_count += 0.05
def conn_comit( connection ):
done = False
try_count = 0.0
while not done:
try:
connection.commit()
done = True
except sqlite.IntegrityError:
# Ignore this error because it means the item already exists in the database
done = True
except Exception, error:
if try_count%60.0 == 0.0: # print error every minute
print "\t" , "Error executing command" , cmd_str
print "Message:" , error
if try_count%120.0 == 0.0: # if waited for 2 miutes, roll back
print "Forcing Unlock"
connection.rollback()
time.sleep(0.05)
try_count += 0.05
##################
#### Run Code ####
##################
connection = sqlite.connect( db_path )
cursor = connection.cursor()
# Create tables if database does not exist
conn_exec( connection , cursor , '''CREATE TABLE IF NOT EXISTS fix (path TEXT PRIMARY KEY);''')
conn_exec( connection , cursor , '''CREATE TABLE IF NOT EXISTS tx (path TEXT PRIMARY KEY);''')
conn_exec( connection , cursor , '''CREATE TABLE IF NOT EXISTS completed (fix DATE, tx DATE);''')
conn_comit( connection )
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
0 votes
Il se peut qu'un autre processus accède au fichier de la base de données - avez-vous vérifié lsof ?
0 votes
J'ai eu le même problème, le problème était dans l'antivirus quand je le désactive mon application fonctionne bien, mais quand je l'active je trouve l'erreur "la base de données est verrouillée", j'espère que cela va vous aider.