База данных не обновляется автоматически с MySQL и Python

у меня возникли проблемы с обновлением строки в базе данных MySQL. Вот код, который я пытаюсь запустить:

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

вывод, который я получаю при запуске этой программы:

4
количество обновленных строк: 1

похоже, что это работает, но если я запрошу базу данных из интерфейса командной строки MySQL (CLI), я нахожу, что она не была обновлена вообще. Однако, если из CLI я вхожу UPDATE compinfo SET Co_num=4 WHERE ID=100; база данных обновляется как ожидаемый.

в чем моя проблема? Я запускаю Python 2.5.2 с MySQL 5.1.30 в окне Windows.

4 ответов


Я не уверен, но я собираюсь догадаться, что вы используете таблицу INNODB, и вы не сделали фиксации. Я считаю, что MySQLdb позволяет транзакции автоматически.

вызов conn.commit() перед вызовом close.

из FAQ:начиная с 1.2.0, MySQLdb отключает автокоммит по умолчанию


MySQLdb имеет автокоммит по умолчанию, который может быть запутанным сначала. Ваше соединение существует в своей собственной транзакции, и вы не сможете увидеть изменения, внесенные другими соединениями, пока не зафиксируете эту транзакцию.

можно сделать conn.commit() после заявления об обновлении, как указывали другие, или вообще отключите эту функцию, установив conn.autocommit(True) сразу после создания объекта подключения.


вам нужно зафиксировать изменения вручную или включить автоматическую фиксацию.

причина, по которой SELECT возвращает измененные (но не сохраненные) данные, заключается в том, что соединение все еще находится в той же транзакции.


Я обнаружил, что разъем Python автоматически отключает автокоммит, и, похоже, нет никакого способа изменить это поведение. Конечно, вы можете снова включить его, но затем, глядя на журналы запросов, он глупо делает два бессмысленных запроса после подключения, чтобы выключить автокоммит, а затем снова включить.