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

StackOverflow https://stackoverflow.com/questions/384228

  •  23-08-2019
  •  | 
  •  

Вопрос

У меня возникли некоторые проблемы с обновлением строки в базе данных 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), я обнаруживаю, что она вообще не обновлялась.Однако, если из командной строки я ввожу UPDATE compinfo SET Co_num=4 WHERE ID=100; база данных обновляется, как и ожидалось.

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

Это было полезно?

Решение

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

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

Из ЧАСТО задаваемых вопросов: Начиная с версии 1.2.0, MySQLdb по умолчанию отключает автоматическую фиксацию

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top