2010-04-02 6 views
4

J'ai une application Python qui renvoie l'erreur standard sqlite3.OperationalError: database is locked. J'ai regardé autour d'Internet et n'ai pas trouvé de solution qui a fonctionné (s'il vous plaît noter qu'il n'y a pas de multiprocès/threading en cours, et comme vous pouvez le voir, j'ai essayé d'augmenter le paramètre timeout). Le fichier sqlite est stocké sur le disque dur local. La fonction suivante est l'une des nombreuses qui accède à la base de données sqlite et s'exécute correctement la première fois qu'elle est appelée, mais renvoie l'erreur ci-dessus la deuxième fois qu'elle est appelée (elle fait partie d'une autre boucle). fonction):sqlite3.OperationalError: la base de données est verrouillée - application non-threadée

def update_index(filepath): 
    path = get_setting('Local', 'web') 
    stat = os.stat(filepath) 
    modified = stat.st_mtime 
    index_file = get_setting('Local', 'index') 

    connection = sqlite3.connect(index_file, 30) 
    cursor = connection.cursor() 
    head, tail = os.path.split(filepath) 
    cursor.execute('UPDATE hwlive SET date=? WHERE path=? AND name=?;', (modified, head, tail)) 
    connection.commit() 
    connection.close() 

Merci beaucoup.

Répondre

1

Avez-vous vraiment besoin d'ouvrir et de fermer en permanence le fichier de base de données pour chaque UPDATE? Si vous faites la même chose dans chaque fonction qui accède à la base de données, est-il possible que vous ayez appelé la fonction update_index depuis une autre fonction qui a déjà ouvert la base de données en utilisant une autre connexion et est en train de modifier la base de données?

+0

La base de données doit être complètement fermée avant que cette fonction ne soit appelée. Si je devais garder la connexion à la base de données ouverte, quelle serait la meilleure méthode? Stockez l'instance 'connection' en dehors de la portée de la fonction, ou passez-la en paramètre? –

+3

Il serait plus logique si vous avez fait une classe, mettre toutes les fonctions traitant de la base de données dans la classe, avoir la connexion en tant qu'attribut membre de la classe. Vous pouvez créer la connexion dans la classe '__init__' et ajouter une méthode' close_connection' (avec un contenu évident) que vous appelez lorsque vous avez terminé. Sinon, vous pouvez rechercher votre code et ajouter des instructions de débogage chaque fois que vous ouvrez et fermez une connexion à la base de données, vérifiez si elles sont imbriquées. – tzot

2

Vous pouvez vérifier en particulier les fonctions qui conservent un verrou en lecture (curseur inachevé). Cela bloquerait la validation de la fonction de mise à jour. Notez qu'il existe une liste de diffusion dédiée pour les problèmes Python-sqlite: http://groups.google.com/group/python-sqlite

Questions connexes