不经常更新视图

2024-04-29 04:39:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我在QMainWindow中开发了一个程序,其中QTableView基于QSqlTableModel。数据库使用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

我几乎可以肯定问题不是来自列表.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()

Tags: inidexecute视频tagvideotagsde
1条回答
网友
1楼 · 发布于 2024-04-29 04:39:47

事实上,我不得不做相反的事。感谢你,伙计:)

在QMainWindow的构造函数中,我使用数据库.open(). 但在我的action addTag中,这个连接仍然是打开的,问题是另一个模块处理数据库中标记的写入。你知道吗

所以,把数据库.close()在我的action addTag开始时,以及数据库.open()在行动结束时,解决了问题。你知道吗

非常感谢,你给了我答案。你知道吗

相关问题 更多 >