2009-09-20 7 views
9

Je suis nouveau sur l'adaptateur MySQL de Python et Python. Je ne suis pas sûr si je manque quelque chose d'évident ici:Python MySQL - SELECT fonctionne mais pas DELETE?

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

Des idées?

+3

quels privilèges avez-vous sur les bases de données? – ennuikiller

+0

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

+0

Quand vous dites "NE SEMBLE PAS TRAVAILLER": comment le savez-vous? Avez-vous une sorte de message d'erreur? Si oui, lequel? S'il vous plaît signaler tous les détails dès le début. –

Répondre

12

Je suppose que vous utilisez un moteur de stockage qui prend en charge les transactions (par exemple InnoDB), mais vous n'appelez pas db.commit() après le DELETE. L'effet de DELETE est ignoré si vous ne validez pas.

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

A partir de 1.2.0, MySQLdb désactive par défaut autocommit, tel que requis par la norme DB-API (PEP-249). Si vous utilisez des tables InnoDB ou un autre type de type de table transactionnelle , vous devez faire Connection.commit() avant de fermer la connexion, ou bien aucun de vos changements seront à la écrit base de données.

Voir aussi cette même question SO: Python MySQLdb update query fails

+0

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

+0

m'a cassé la tête avec cela hier ... a pris un certain temps pour comprendre pourquoi. Pensez-vous qu'il y a un gain de performance à tout faire en même temps? c'est-à-dire, au lieu de supprimer pour chaque instance dans une boucle for, commettre à la fin avant de fermer? – Cmag

+1

Oui, il y a certainement un gain de performance. Par exemple, la configuration par défaut pour InnoDB fait 'fsync()' après chaque validation de transaction. Voir http://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit –

0

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

La fonction est loin d'être une gêne:

Il vous permet d'économiser des questions de corruption de données quand il y a des erreurs dans vos requêtes.

1

Vous violez peut-être une contrainte de clé étrangère.

0

Le problème est peut-être que vous ne validez pas les modifications. il peut être fait par conn.commit()

en savoir plus sur ce here