Подтвердить что ты не робот

База данных не обновляется автоматически с помощью 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.

4b9b3361

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

Я много работал с базой MySQL в Python, и я всегда забывал зафиксировать запрос. SO Zoredashe является правильным.

Ответ 6

Вышеприведенные ответы верны, но, похоже, в PyMySQL есть ошибка или изъяна - при отключении autocommit (по умолчанию) commit записывает только последнюю вставленную или обновленную запись. Кажется, что нет способа создать транзакцию для распыления ряда связанных вставок/обновлений. Используя autocommit, вы рискуете оказаться в несогласованной базе данных, если что-то сбой между вставками/обновлениями. Или я чего-то не хватает?