ich beziehe mich hier auf diesen von mir gestarteten Thread:
http://www.python-forum.de/topic-18651.html
Allerdings ist diese Frage eher fortführend, daher ist es imho sinnvoller das als neuen Thread abzuarbeiten.
So, nun zum Problem:
Ziel ist es, eine kleine externe Highscore-Liste für das Spiel Ultrastar zu entwickeln. Dazu benötige ich eine Songauswahl, einen Sänger (oder ein Team) sowie die dazugehörigen Punkte.
Ich habe nun ein kleines Widget, indem es zwei QSqlQueryModels gibt, die einmal eine Liste mit Songs befüllen und einmal die Combo-Box mit Sängern.
Nun will ich in einer Tabelle in der SQLite-DB die erzielten Punkte bei einem Lied eintragen, sobald der PushButton geklickt wird.
So weit so gut.
Leider klappt das nicht! Die Transaktion kann nicht zu ende gebracht werden, es kommt zu folgendem Fehler:
Code: Alles auswählen
database is locked Unable to commit transaction
http://doc.trolltech.com/4.5/qsqldatabase.html#commit
Nun meine Frage: Wie kann man das Problem lösen?
Hier meine save()-Methode. Darin sind schon einige Ansätze enthalten, auf die in der Qt4 Doku verwiesen wurde (das .finish()). Leider hat das keinen Erfolg - außer dass die Inhalte der Views futsch sind (was ja auch logisch erscheint).
Code: Alles auswählen
def save(self):
print "Comitte Daten!"
#self.ui.songs.model().sourceModel().query().finish()
#self.ui.singer.model().query().finish()
#print QtSql.QSqlDatabase.database().transaction()
query = QtSql.QSqlQuery()
query.prepare("""
INSERT INTO gesungen (player, song, punkte) VALUES (:pid, :sid, :punkte)
""")
query.bindValue(":pid", QtCore.QVariant(0))
query.bindValue(":sid", QtCore.QVariant(0))
query.bindValue(":punkte", QtCore.QVariant(100))
query.exec_()
#print QtSql.QSqlDatabase.database().commit()
print QtSql.QSqlDatabase.database().lastError().text()