[gelöst] QSqlQueryModel und transaction-Konflikt

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Nabend allerseits,

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
Nach meinen Recherchen dürfte das wohl an den beiden Queries liegen, die zu den beiden Models gehören. Diese scheinen eben permanent "aktiv" zu sein. Zumindest habe ich mir das so aus der Doku zusammengereimt.
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()
Also hoffe ich einmal, dass ich da was (triviales) übersehen habe ...
Zuletzt geändert von Hyperion am Donnerstag 28. Mai 2009, 08:36, insgesamt 2-mal geändert.
lunar

Zuerst solltest du mal ein lauffähiges Beispiel posten, welches die Reproduktion des Fehlers ermöglicht. So ins Blaue hinein kann man da jetzt wenig zu sagen ...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ja, komme ich wohl nicht drum herum. Ich werde da mal morgen was zusammenstellen und dann verlinken.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Manchmal ist man einfach nur blind und dazu kommen dann noch ungünstige Konstellationen ...

ich habe festgestellt, dass in meinem Hauptverzeichnis noch eine sonderbare Datei enthalten war, die auf irgend eine Weise zu diesen Problemen geführt haben muss:

Code: Alles auswählen

nelson@victory:~/src/Python/singstar$ ls 
C:\Dokumente und Einstellungen\MECL User 1\Eigene Dateien\src\Python\singstar\singstar.sqlite
gui                                                                                          
icons                                                                                        
model.py                                                                                     
model.py~                                                                                    
sing_gui.py                                                                                  
sing_gui.py~                                                                                 
sing.py                                                                                      
singstar2.sqlite                                                                             
singstar.sqlite                                                                              
songs.txt                                                                                    
Diese verkrüppelte Datei aus irgend einer "von Windows hier her Kopier"-Aktion entstanden hatte Schuld. Nachdem ich sie gelöscht habe, scheint es nun zu klappen :-)

*narf* Manchmal ist man eben auch blind - hatte mich schon gewundert, wieso "ls" Zeilenweise ausgibt, gesehen habe ich es nicht ...

Tja, war wohl schon zu spät gestern ;-)
Antworten