GiJay hat geschrieben: ↑Donnerstag 19. Oktober 2023, 15:26
Tach auch,
mein erste db-Anwendung
es gibt eine SQLite Datenbank. Um die bestehenden Datensätze zu ändern nutze ich ein Model (QSqlTableModel) und einen Mapper (QDataWidgetMapper). Dies funktioniert einwandfrei.
Jetzt möchte ich einen neuen Datensatz anhängen. Meine Überlegung:
- leeren Record erstellen
- Record am Ende der db einfügen
- Ans Ende vom Mapper gehen
- Daten ans Model übertragen
- Daten in die db eintragen
Das ist nicht ganz richtig beschrieben (und hat, glaube ich, PyGuest auf eine falsche Fährte geführt). Du fügst den neuen Datensatz erst einmal ins Model ein, nicht in die Datenbank; am Ende schreibst Du ja auch ganz richtig "Daten in die db eintragen" - das ist ein Extra-Vorgang. Und "ans Ende vom Mapper gehen" stimmt so auch nicht. Der Mapper kennt immer nur einen Model-Satz, dieser Satz kann aber am Anfang oder am Ende des Models stehen, oder er folgt auf den im Moment aktuellen Satz usw. "Den Mapper ans Ende des Models schicken" wäre also besser.
Der ganze Witz vom QDataWidgetMapper ist doch, dass er Eingabefelder, die sich auf einen einzelnen Satz beziehen, mit wechselnden Sätzen des Models verbinden und die Daten zwischen diesen beiden Instanzen austauschen kann (von Datenbanken weiß der im übrigen schon mal gar nichts). Da Du sagst, dass das Ändern einzelner Datenbanksätze funktioniert, hast Du ja offensichtlich Eingabefelder für die Felder eines einzelnen Datensatzes, sonst wäre der Mapper ja sowieso sinnlos.
Es ist ganz richtig, dass nach "self.mapper.toLast()" diese Eingabefelder mit dem letzten Satz des Models verbunden sind (nicht mit dem letzten Satz der Datenbank, über den man im Normalfall tatsächlich nichts weiß). Nur: in Deinem Code wird der neue, leere Satz erzeugt, ans Model angehängt und dann wird sofort "self.mapper.submit()" aufgerufen. Hast Du in diesem Augenblick schon die neuen Werte in Deinen Eingabefeldern stehen? Es ist ein bisschen schade, dass Du Dich zu dieser Seite der Sache gar nicht äußerst.
Code: Alles auswählen
rec = self.model.record()
self.model.insertRecord(-1, rec)
self.mapper.toLast()
self.mapper.submit()
self.model.submitAll()
Bis "Record am Ende der db einfügen" funktioniert es. Bekomme aber die Daten aus dem Mapper dann nicht in den Record.
Welchen Gedankenfehler mache ich?
Wie macht man das am geschicktesten?
Der naheliegende Weg (den ich, glaube ich, aus einem guten Lehrbuch zu PyQt4 habe): die beiden Vorgänge "Neuen, leeren Satz erzeugen" und "den aktuellen, fertig belegten Satz an die Datenbank schicken" werden als zwei getrennte Methoden implementiert und getrennt aufgerufen (zwei Schalter, zwei Menüeinträge, was auch immer). Der zweite Teil kann für neue und geänderte Sätze benutzt werden. Die Trennlinie wäre zwischen "self.mapper.toLast()" und "self.mapper.submit()". Mindestens die letztere Methode gibt übrigens True oder False zurück und das kann man abfragen und evtl. darauf reagieren.
Ach ja, und wie vielleicht schon klar geworden ist: wir reden hier tatsächlich von PyQt.