2009-06-22 7 views
13

OK. J'ai construit ici un navigateur de requête mysql, comme navicat. Utiliser MySQLdb pour effectuer des requêtes.La requête de mise à jour Python MySQLdb échoue

Voici la partie la plus étrange. Quand je lance la requête à travers le programme (en utilisant MySQLdb), ça me donne du succès, row = 1, mais quand je le regarde dans phpmyadmin, la valeur n'a pas changé.

donc avant que je Réalise la requête, je l'imprimer, copier et coller dans la fenêtre de requête de phpmyadmin, enfourchez et cela fonctionne. En bref, la requête de mise à jour ne fonctionne pas, mais quand je copie et colle dans phpmyadmin, cela fonctionne.

self.tbl.sql.use(self.tbl.database)  # switches to correct database. I've printed this and it uses the corrected db 
if self.tbl.sql.execute(query) == True: 
    print sql_obj.rows_affected()   # returns 1 (since i only do 1 query) 

Et voici la partie de la classe SQL

def execute(self, query): 

    try: 
     self.cursor.execute(query) 
     return True 
    except MySQLdb.ProgrammingError as error: 
     print "---->SQL Error: %s" % error 
     return False 
    except MySQLdb.IntegrityError as e: 
     print "--->SQL Error: %s" % e  
     return False 

donc des idées qui pourraient se produire?

+2

merci pour ce que j'avais la question exacte – KacieHouser

Répondre

16

Juste une supposition: Peut-être le code en Python est en cours d'exécution dans une transaction, et la transaction pourrait avoir besoin d'être explicitement engagé?

Edit: Il y a un entry in the MySQLdb FAQ qui pourrait être pertinent.

+2

+1: Aucun commit signifie que le changement est invisible à tout le monde. –

+0

Oui. c'était ça. Merci beaucoup! – sqram

19

Je crois que @Jason Creighton et @ S.Lott sont corrects. Au moins si la table que vous mettez à jour se trouve sur un moteur de stockage transactionnel.

InnoDB est transactionnel, ISAM ne l'est pas.

Vous devez appeler commit() sur votre objet de connexion avant de le fermer ou vous devez définir la connexion en mode autocommit. Je ne suis pas sûr comment vous faites cela pour une connexion MySQLdb, je suppose que vous définissez un argument au constructeur de connexion, ou définissez une propriété après avoir créé l'objet de connexion.

Quelque chose comme:

conn = mysql.connection(host, port, autocommit=True) 

# or 
conn = mysql.connection(host, port) 
conn.autocommit(True) 
+0

Ahh je vois. Oui, c'était le problème. Bien que vous ayez posté la réponse de réponse directement, je devrai marquer celle de Jason comme étant acceptée, comme il a répondu en premier, avec un lien vers la solution. Merci beaucoup, je vais lui donner 1+! :) – sqram

+2

Ouais! Votre seconde supposition est la bonne - conn.autocommit (True) fonctionne (bien que les commits explicites soient encore meilleurs ;-). –

Questions connexes