web-dev-qa-db-fra.com

La base de données ne se met pas à jour automatiquement avec MySQL et Python

J'ai du mal à mettre à jour une ligne dans une base de données MySQL. Voici le code que j'essaye d'exécuter:

import MySQLdb

conn=MySQLdb.connect(Host="localhost", user="root", passwd="pass", db="dbname")
cursor=conn.cursor()

cursor.execute("UPDATE compinfo SET Co_num=4 WHERE ID=100")
cursor.execute("SELECT Co_num FROM compinfo WHERE ID=100")
results = cursor.fetchall()

for row in results:
    print row[0]

print "Number of rows updated: %d" % cursor.rowcount

cursor.close()
conn.close()

Le résultat que j'obtiens lorsque j'exécute ce programme est:

4
Nombre de lignes mises à jour: 1

Il semble que cela fonctionne, mais si j'interroge la base de données à partir de l'interface de ligne de commande MySQL (CLI), je trouve qu'elle n'a pas été mise à jour du tout. Cependant, si à partir de la CLI, j'entre UPDATE compinfo SET Co_num=4 WHERE ID=100; la base de données est mise à jour comme prévu.

Quel est mon problème? J'exécute Python 2.5.2 avec MySQL 5.1.30 sur une boîte Windows.

37
Ian Burris

Je ne suis pas sûr, mais je vais supposer que vous utilisez une table INNODB et que vous n'avez pas effectué de validation. Je crois que MySQLdb active les transactions automatiquement.

Appelez conn.commit() avant d'appeler close.

À partir de la FAQ: À partir de 1.2.0, MySQLdb désactive l'autocommit par défaut

62
Zoredache

MySQLdb a désactivé l'autocommit par défaut, ce qui peut être déroutant au début. Votre connexion existe dans sa propre transaction et vous ne pourrez pas voir les modifications que vous apportez à partir d'autres connexions tant que vous n'aurez pas validé cette transaction.

Vous pouvez soit faire conn.commit() après l'instruction de mise à jour comme d'autres l'ont souligné, soit désactiver complètement cette fonctionnalité en définissant conn.autocommit(True) juste après avoir créé l'objet de connexion.

29
ʞɔıu

Vous devez valider les modifications manuellement ou activer la validation automatique.

La raison pour laquelle SELECT renvoie les données modifiées (mais non persistantes) est que la connexion est toujours dans la même transaction.

8
muhuk

J'ai constaté que le connecteur de Python désactive automatiquement l'autocommit, et il ne semble pas y avoir de moyen de modifier ce comportement. Bien sûr, vous pouvez le réactiver, mais en regardant les journaux de requêtes, il effectue bêtement deux requêtes inutiles après la connexion pour désactiver puis réactiver l'autocommit.

1
MarkR