Sqlite python sqlite3.OperationalError: base de données est verrouillée
J'ai écrit le code suivant, qui montre la sqlite3.OperationalError: database is locked
erreur. Toute aide pour le débogage serait très apprécié.
Fondamentalement, je suis en train de copier les données de la table 1 pour table2 et d'insertion de données à la table2 basée sur les changements qui se produisent à table1 par une autre application.
Regarde comme je suis en manque une partie.
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]
Modifier
Ci-dessous est le traceback
Traceback (most recent call last):
File "try2.py", line 28, in <module>
conn2.execute(InsertTest)
sqlite3.OperationalError: database is locked
Merci de nous montrer le traceback. Sans connaître la ligne qui soulève cette exception, il est beaucoup plus difficile à déboguer le problème.
sqlite ne gère pas la simultanéité bien ...
Il ne gère pas les efficace, mais il n'manipuler correctement. En outre, si l'OP n'a en fait qu'une seule connexion vers le même fichier à la fois, qui ne devrait pas d'importance de toute façon.
Pendant ce temps, est-ce le seul programme à l'aide de la base de données? Vu le nom, je pense peut-être que votre application Skype est écrit à la même heure. C'est peut-être intentionnellement en gardant la base de données verrouillée pour s'assurer qu'il ne peut pas se confondre par d'autres programmes de vissage avec ses données à la mi-course? Qu'advient-il si vous quittez Skype?
Oui Skype va écrire dans la base de données, peut-être ce qu'il se verrouille. Mais je ne peux pas l'éviter? Ou de créer une autre base de données pour mon Logginf
sqlite ne gère pas la simultanéité bien ...
Il ne gère pas les efficace, mais il n'manipuler correctement. En outre, si l'OP n'a en fait qu'une seule connexion vers le même fichier à la fois, qui ne devrait pas d'importance de toute façon.
Pendant ce temps, est-ce le seul programme à l'aide de la base de données? Vu le nom, je pense peut-être que votre application Skype est écrit à la même heure. C'est peut-être intentionnellement en gardant la base de données verrouillée pour s'assurer qu'il ne peut pas se confondre par d'autres programmes de vissage avec ses données à la mi-course? Qu'advient-il si vous quittez Skype?
Oui Skype va écrire dans la base de données, peut-être ce qu'il se verrouille. Mais je ne peux pas l'éviter? Ou de créer une autre base de données pour mon Logginf
OriginalL'auteur Technopolice | 2014-11-27
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas sûr si cela va aider quelqu'un, mais j'ai trouvé une solution à mon propre Verrouillé problème de Base de données.
- Je utiliser PyCharm et a constaté que plusieurs instances de l'script je travaillais étaient tous en cours d'exécution. Cela est généralement dû à des erreurs dans le code que j'ai été le tester, mais il est resté actif (et donc la connexion à la db était encore actif). Près de ceux (arrêtez tous les processus) et essayez de nouveau - il a travaillé tous les temps pour moi!
Si quelqu'un connait un moyen de le rendre timeout après un peu de temps, s'il vous plaît commentaire de cette solution. J'ai essayé
cur.execute("PRAGMA busy_timeout = 30000")
(trouvé à partir d'un autre thread sur une question similaire) mais il ne semble pas faire quoi que ce soit.OriginalL'auteur Steven B
"Base de données est verrouillée" signifie que certains autres de connexion a une connexion active.
Utilisation PRAGMA busy_timeout attendre un certain temps pour les autres opérations de finition:
Toutefois, si cette autre application délibérément conserve une transaction ouverte pour garder la base de données verrouillée, il n'y a rien que vous pouvez faire.
execute()
est une méthode pour les curseurs pas pour les connexions.Dire que la module sqlite3.
Je l'ai dit, mais il a répondu que: une Fois que vous avez une Connexion, vous pouvez créer un objet Curseur et appeler sa méthode execute () pour exécuter des commandes SQL
OriginalL'auteur CL.
Je pense que vous devez fermer la connexion qui vous ont ouvert,peut-être l'erreur est à cause de la cause que vous avez ouvert plusieurs connexions.
OriginalL'auteur Shinto Joseph
J'ai eu le même problème mais il a été résolu quand j'ai utilisé les méthodes suivantes pour fermer les connexions simultanées.
Donc, si votre programme commence comme ceci:
Assurez-vous que vous êtes, y compris les conn.close() après chaque instruction SQL
OriginalL'auteur SAM123