我在QMainWindow中开发了一个程序,其中有一个基于QSqlTableModel的QTableView。该数据库使用sqlite。
此程序应显示视频列表。我通常可以为每个视频添加一些标签和演员(标签和演员存储在数据库中)。当我显示一些视频时,一切正常,但当视频数量增加时,我的程序就会出现这样的异常:
Traceback (most recent call last):
File "/home/djipey/informatique/python/bibli/gui.py", line 572, in addTag
liste.addTag(vids_selected, tag_to_add.split(" "))
File "/home/djipey/informatique/python/bibli/liste.py", line 488, in addTag
bdd.commit()
sqlite3.OperationalError: database is locked
我几乎可以肯定问题不是来自liste.py,因为我关闭了每个连接和光标。不,我的数据库在其他地方很忙。
我认为问题来自于视图/模型,当它们显示信息时,我想知道是否可以降低显示速率?否则,我会对解决问题的每一个建议持开放态度。
def addTag(list_vids, list_tags):
""" Ajoute tous les tags de list_tags à chaque vid de list_vids. Pour
cela crée un tag dans la table tags, puis établit une relation entre
l'id de la vidéo et l'id du tag créé. Inscrit la correspondance dans
la table videos_tags. """
bdd = sqlite3.connect("fichiers.sqlite") # ouverture de la base
bdd.row_factory = sqlite3.Row # accès aux colonnes par leur nom, pas par leur index
c = bdd.cursor() # obtention d'un curseur
#On ajoute le tag transmis à la table tags s'il n'existe pas déjà
for each_tag in list_tags:
c.execute("SELECT * FROM tags WHERE name= ? ", (each_tag,))
if c.fetchone() is None:
c.execute("INSERT INTO tags (name) VALUES (?) ", (each_tag,))
bdd.commit()
for each_video in list_vids:
for each_tag in list_tags:
#On récupère l'id du tag pour s'en servir après
c.execute("SELECT id FROM tags WHERE name= ?", (each_tag,))
id_tag_recupere = c.fetchone()["id"]
#On vérifie que le tag à stocker n'est pas déjà associé à la vidéo
c.execute("SELECT * FROM videos_tags WHERE id_video = ? AND id_tag = ?", (each_video, id_tag_recupere))
if c.fetchone() is None:
c.execute("INSERT INTO videos_tags (id_video, id_tag) VALUES (?, ?)", (each_video, id_tag_recupere))
bdd.commit()
else:
print("Cette vidéo a déjà ce tag")
c.close()
答案 0 :(得分:0)
实际上,我不得不这样做。谢谢你的男人:)
在我的QMainWindow的构造函数中,我使用database.open()启动与数据库的连接。但是在我的动作addTag中,这个连接仍然是开放的,问题是另一个模块处理数据库中标签的写入。
因此,在操作结束时将database.close()放在我的操作addTag和database.open()的开头,解决了问题。
非常感谢,你给了我答案。