База данных не обновляется автоматически с MySQL и Python - PullRequest
35 голосов
/ 21 декабря 2008

У меня проблемы с обновлением строки в базе данных 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

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

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

Ответы [ 4 ]

59 голосов
/ 21 декабря 2008

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

Позвоните conn.commit(), прежде чем звонить close.

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

27 голосов
/ 21 декабря 2008

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

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

8 голосов
/ 21 декабря 2008

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

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

1 голос
/ 21 декабря 2008

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

...