10
votes

Python MySQL - Sélectionne le travail mais ne supprime pas?

Je suis nouveau à l'adaptateur MySQL de Python et Python. Je ne sais pas si je manque quelque chose d'évident ici:

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))


4 commentaires

Quels privilèges avez-vous sur les bases de données?


Oui, assurez-vous que l'utilisateur que vous utilisez a le droit de supprimer des lignes.


Quand vous dites "ne semble pas fonctionner": comment savez-vous? Avez-vous un message d'erreur? Si oui, lequel? Veuillez signaler tous les détails à l'avance.


Excuses. En ne semble pas fonctionner, je veux dire que si je exécutez Select * à partir des utilisateurs; À la console MySQL, je vois toujours la rangée là-bas. Il n'y a pas de message d'erreur du tout. L'utilisateur a des privilèges complets.


4 Réponses :


12
votes

Je suppose que vous utilisez un moteur de stockage prenant en charge les transactions (par exemple InnoDB), mais vous n'appelez pas db.comp () après la suppression. L'effet de la suppression est jeté si vous ne vous engagez pas.

voir http: //mysql-python.sourceforge.net/faq.html#my-Data-Disappareed-or-won-t-go-away :

commençant par 1.2.0, mysqldb désactive autocommouver Par défaut, selon les besoins de la norme DB-API (PEP-249). Si tu utilisent des tables innovées ou une autre type de type de table transactionnel, vous aurez besoin de faire connace.commit () avant de fermer la connexion, ou bien Aucun de vos changements ne sera écrit à la base de données.

Voir aussi cette similaire de question: Python MYSQLDB Update La requête échoue


3 commentaires

Bingo! C'est la chose spécifique à la python que je cherchais, car ce qui précède aurait travaillé dans PHP ou Ruby sans problème sans problème. Merci les gars!


m'a brisé la tête avec ça hier ... a pris un certain temps pour comprendre pourquoi. Pensez-vous qu'il y a un gain de performance de tout commet à la fois? C'est-à-dire au lieu de supprimer chaque instance de A pour une boucle, commettez-la à la fin avant la fermeture?


Oui, il y a certainement un gain de performance. Par exemple, la configuration par défaut pour Innodb fait un FSYNC () après chaque transaction commit. Voir dev.mysql.com/doc/refman/5.5 / fr / ...



0
votes

à votre code ci-dessus, Il suffit d'ajouter un appel à self.db.commit () .

La fonctionnalité est loin d'une gêne:

Cela vous permet d'économiser des problèmes de corruption de données quand il y a des erreurs dans vos questions.


0 commentaires

1
votes

Peut-être que vous violez une contrainte de clé étrangère.


0 commentaires

0
votes

Le problème peut être que vous n'engageez pas les modifications. Cela peut être fait par conn.ch.came ()

En savoir plus sur ce ici < / a>


0 commentaires