2009-09-20 8 views
9

Ich bin neu in Python und Python's MySQL Adapter. Ich bin mir nicht sicher, ob mir hier etwas offensichtlich fehlt:Python MySQL - SELECTs arbeiten, aber nicht DELETEs?

db = MySQLdb.connect(# db details omitted) 
cursor = self.db.cursor() 

# WORKS 
cursor.execute("SELECT site_id FROM users WHERE username=%s", (username)) 
record = cursor.fetchone() 

# DOES NOT SEEM TO WORK 
cursor.execute("DELETE FROM users WHERE username=%s", (username)) 

Irgendwelche Ideen?

+3

welche Privilegien haben Sie in den Datenbanken durchgeführt werden? – ennuikiller

+0

Ja, stellen Sie sicher, dass der Benutzer, den Sie verwenden, die Rechte zum Löschen von Zeilen hat. –

+0

Wenn Sie sagen: "Sieht nicht funktionieren": Woher weißt du das? Erhalten Sie eine Art Fehlermeldung? Wenn ja, welcher? Bitte melden Sie alle Details im Voraus. –

Antwort

12

Ich würde vermuten, dass Sie eine Speicher-Engine verwenden, die Transaktionen unterstützt (z. B. InnoDB), aber Sie db.commit() nach dem Löschen nicht aufrufen. Die Wirkung von DELETE wird verworfen, wenn Sie nicht festschreiben.

Siehe http://mysql-python.sourceforge.net/FAQ.html#my-data-disappeared-or-won-t-go-away:

Beginnend mit 1.2.0 MySQLdb deaktiviert autocommit standardmäßig wie durch den DB-API-Standard (PEP-249) erforderlich. Wenn Sie InnoDB-Tabellen verwenden oder eine andere Art von Transaktionstabellentyp, Sie benötigen Connection.commit() vor dem Schließen der Verbindung zu tun, sonst keine Ihrer Änderungen werden in die Datenbank geschrieben werden.

Siehe auch diese ähnliche Frage SO: Python MySQLdb update query fails

+0

Bingo! Dies ist die Python-spezifische Sache, nach der ich gesucht habe, weil das obige ohne Probleme in PHP oder Ruby funktioniert hätte. Danke Leute! –

+0

hat mir gestern den Kopf gebrochen ... brauchte eine Weile, um herauszufinden, warum. Denken Sie, dass es einen Leistungsgewinn gibt, wenn Sie alles auf einmal machen? dh statt für jede Instanz in einer for-Schleife zu löschen, am Ende vor dem Schließen zu committen? – Cmag

+1

Ja, es gibt definitiv einen Leistungszuwachs. Zum Beispiel führt die Standardkonfiguration für InnoDB nach jedem Transaktions-Commit ein 'fsync()' durch. Siehe http://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit –

0

Um Ihren Code oben, gerade einen Anruf zu self.db.commit() hinzufügen.

Die Funktion ist weit davon entfernt ein Ärgernis:

Es Sie von Datenkorruption speichert gibt wenn es Fehler in Ihren Abfragen sind.

1

Möglicherweise verletzen Sie eine Fremdschlüsseleinschränkung.

0

Das Problem besteht möglicherweise darin, dass Sie die Änderungen nicht übernehmen. es kann durch conn.commit()

lesen Sie mehr auf diese here

Verwandte Themen