Question

Je vais avoir quelques problèmes de mise à jour d'une ligne dans une base de données MySQL. Voici le code que je suis en train de courir:

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

La sortie que je reçois quand je lance ce programme est:

  

4
Nombre de lignes mises à jour: 1

Il semble que ça fonctionne, mais si j'interroger la base de l'interface de ligne de commande MySQL (CLI) Je trouve qu'il n'a pas été mis à jour du tout. Toutefois, si 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? Je suis en Python avec MySQL 5.1.30 2.5.2 sur une boîte de Windows.

Était-ce utile?

La solution

Je ne suis pas certain, mais je vais deviner que vous utilisez une table InnoDB, et ne vous ai pas fait commettras. Je crois MySQLdb permettent automatiquement les transactions.

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

De la FAQ: A partir de 1.2.0, MySQLdb désactive la validation automatique par défaut

Autres conseils

MySQLdb a autocommit désactivé par défaut, qui peut être déroutant au premier abord. Votre connexion existe dans sa propre transaction et vous ne serez pas en mesure de voir les modifications apportées par d'autres connexions jusqu'à ce que vous commettez cette transaction.

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

Vous devez valider les modifications auto-commit manuellement ou activer.

La raison SELECT renvoie les données modifiées (mais pas persisté) est parce que la connexion est toujours dans la même transaction.

J'ai trouvé que le connecteur Python se met automatiquement hors autocommit, et il ne semble pas être un moyen de modifier ce comportement. Bien sûr, vous pouvez le rallumer, mais en regardant ensuite les journaux de requêtes, il ne bêtement deux requêtes inutiles se connecter après pour désactiver l'autovalidation puis rallumez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top