mysqldb: UPDATE funktioniert mysteriöser Weise nicht

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
samy-delux
User
Beiträge: 44
Registriert: Donnerstag 26. April 2007, 19:23

mysqldb: UPDATE funktioniert mysteriöser Weise nicht

Beitragvon samy-delux » Mittwoch 5. Dezember 2007, 21:28

Ich habe auf einem meiner Server ein Python Skript, welches auf einen anderen Server mittels einer verschlüsselten MySQL Verbindung zugreift. So weit klappt auch alles.
Es wird mit den connect() Aufruf zu der Datenbank "dns" verbunden. Alle Queries dort gehen auch. Aber ich muss auch noch eine Query auf die Datenbank "test" laufen lassen.
Da kommen dann die Probleme ins Spiel:

Folgenden Code führe ich aus:

Code: Alles auswählen

command = "UPDATE `test`.`abuse` SET `active` = 1, `ip` = 'test' WHERE `defendant` = 'test@1';"
print mastercursor.execute ( command )


Ausgabe davon ist "5", was auch stimmt, denn es sollten 5 Rows betroffen sein. Doch an den Rows ändert sich absolut nichts:

Code: Alles auswählen

mysql> SELECT `active`, `ip` FROM `kilu`.`abuse` WHERE `defendant` = 'test@1';
+--------+----------------+
| active | ip             |
+--------+----------------+
|      0 | 84.168.187.174 |
|      0 | 84.168.187.174 |
|      0 | 84.168.187.174 |
|      1 | 84.168.187.174 |
|      0 | 84.168.187.174 |
+--------+----------------+

Wenn ich die Query jedoch in PHPMyAdmin kopiere klappt alles wunderbar!
Vieleicht hat das Problem ja eine ganz Banale Lösung die mir nur nicht auffällt?
Schon mal danke für eure Hilfe!

so long,
Samy
BlackJack

Beitragvon BlackJack » Mittwoch 5. Dezember 2007, 21:35

`commit()` vergessen?
samy-delux
User
Beiträge: 44
Registriert: Donnerstag 26. April 2007, 19:23

Beitragvon samy-delux » Mittwoch 5. Dezember 2007, 21:41

"commit()" ist doch dazu da um ganze Transaktionen in einem Zug auszuführen, oder? Brauche ich das hier??
Und wenn dann einfach ein executemany() machen und das "commit()" einfach hinten an das "UPDATE" dranhängen?
BlackJack

Beitragvon BlackJack » Mittwoch 5. Dezember 2007, 21:50

`commit()` ist dazu da die Transaktion (positiv) zu beenden. Wenn man das nicht macht, sind die Änderungen wirkungslos weil sie verworfen werden.
samy-delux
User
Beiträge: 44
Registriert: Donnerstag 26. April 2007, 19:23

Beitragvon samy-delux » Mittwoch 5. Dezember 2007, 21:59

Danke für den Tipp. Liegt anscheinend daran dass mysqldb auto-commit ausschaltet. Scheint etwas gewöhnungsbedürftig, vor allem da ich nach einer kurze Google Suche gleich mehrere Leute gefunden habe die auch Lange nach einer Lösung suchten!

Aber hier gehts ja wie immer schnell ;)
BlackJack

Beitragvon BlackJack » Mittwoch 5. Dezember 2007, 22:11

Das auto-commit aus ist, liegt an der DB API 2.0, da ist das so spezifiziert.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Donnerstag 6. Dezember 2007, 11:42

Ist ja auch sinnvoll. Stell dir vor, du machst aus versehen irgendeinen Schmarrn und Autocommit ist an. Dafür gibt es ein explizites Commit, so dass du im Falle von Fehlern (Exceptions) keine kaputten Daten in der Datenbank hast.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
jens
Moderator
Beiträge: 8458
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Beitragvon jens » Donnerstag 6. Dezember 2007, 13:24

Siehe auch [wiki]DB Transaktionen[/wiki]

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Beitragvon Y0Gi » Donnerstag 6. Dezember 2007, 16:51

Leonidas hat geschrieben:Ist ja auch sinnvoll. Stell dir vor, du machst aus versehen irgendeinen Schmarrn und Autocommit ist an. Dafür gibt es ein explizites Commit, so dass du im Falle von Fehlern (Exceptions) keine kaputten Daten in der Datenbank hast.

Warum sollte man Schmarrn machen? Wenn man Daten falsch aufbereitet in eine DB stecken will, hält einen das `commit()` auch nicht davon ab. Wird bei der Verarbeitung/Vorbereitung der Daten eine Exception geworfen, wird der Query selbst gar nicht erst ausgeführt.
Commits dienen nicht dazu, Fehler zu verhindern, sondern Zusammenfassen von Queries sowie Rollbacks (die man AFAIK auch nur bei mehreren Queries, die voneinander abhängen, einsetzt) zu erlauben.

Autocommit ist einfach etwas Komfort/weniger Arbeit, wenn man von vornherein weiß, dass man keine Transaktionen verwenden will (oder sich diese im Einzelfall irgendwie einfügen lassen).
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Freitag 7. Dezember 2007, 14:19

Stell dir vor, du speicherst Daten in eine Datenbank. Du fängst also an reinzuschreiben (oder zu löschen), der Autocommit ist an, die Daten sind in einem inkonsistenten zustand, weil das alles nicht mit einem Query erledigt ist. Dann kommt etwas Code, der irgendwas macht und dann eine Exception wirft bevor die Konsistenz der Daten durch weitere Anweisunge wiederhergestellt werden konnte. Hereka, jetzt darfst du "per Hand" die Queries zückgängig machen (wobei per Hand auch meinen kann dass du Code brauchst, der die Daten richtet).

Das meinte ich.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Beitragvon Y0Gi » Samstag 8. Dezember 2007, 14:48

Ja, dafür gibt's Transaktionen. Wenn sich diese nicht explizit auch bei Autocommit nutzen lassen, sollte man natürlich Autocommit tunlichst deaktivieren.

Naja, die Sache ist wohl klar und wir meinen wohl dasselbe.

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]