295 votes

Comment déverrouiller une base de données SQLite ?

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 ?

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.

2voto

shreeji Points 16

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.

1voto

Shawn Swaner Points 1070

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é.

1voto

Philip Clarke Points 382

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.

1voto

Flow Points 46

Je viens d'avoir la même erreur. Après 5 minutes de recherche sur Google, j'ai découvert que je n'avais pas fermé un shell qui utilisait la base de données. Il suffit de le fermer et de réessayer ;)

1voto

Jared Glass Points 649

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

mon code python

##############
#### 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.com

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.

Powered by:

X