1

QSqlTableModelに基づくQTableViewを使用して、QMainWindowでプログラムを開発しました。データベースは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()
4

1 に答える 1

0

実際、私は逆のことをしなければなりませんでした。ありがとうございます:)

QMainWindow のコンストラクターで、database.open() を使用してデータベースへの接続を開始します。しかし、私のアクション addTag では、この接続はまだ開いていて、別のモジュールがデータベースへのタグの書き込みを処理していました。

したがって、アクション addTag の先頭に database.close() を配置し、アクションの最後に database.open() を配置すると、問題が解決しました。

どうもありがとう、あなたは私に答えをくれました。

于 2013-01-06T18:53:43.890 に答える