У меня проблемы с обновлением строки в базе данных 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
Number of rows updated: 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.
Из FAQ: Начиная с версии 1.2.0 MySQLdb по умолчанию отключает автоматическую фиксацию.
Вам нужно зафиксировать изменения вручную или включить автоматическую фиксацию.
Причина, по которой SELECT возвращает измененные (но не сохраненные) данные, заключается в том, что соединение все еще находится в той же транзакции.
Я хочу знать, почему я включил автоматическую фиксацию в mysql, но мне тоже нужен conn.commit()?
Я обнаружил, что соединитель Python автоматически отключает автоматическую фиксацию, и, похоже, нет никакого способа изменить это поведение. Конечно, вы можете включить его снова, но затем, глядя на журналы запросов, он тупо выполняет два бессмысленных запроса после подключения, чтобы выключить и снова включить автоматическую фиксацию.
MySQLdb по умолчанию отключил автоматическую фиксацию, что поначалу может сбивать с толку. Ваше соединение существует в своей собственной транзакции, и вы не сможете увидеть изменения, которые вы вносите из других соединений, пока вы не зафиксируете эту транзакцию.
Вы можете либо выполнить conn.commit() после оператора обновления, как указывали другие, либо полностью отключить эту функцию, установив conn.autocommit(True) сразу после создания объекта подключения.
Установка conn.autocommit (true) после подключения означает, что он отправляет на сервер две лишние команды - было бы лучше, если бы был способ их избежать.
это было бы было бы лучше, если бы был такой способ, согласен. но это не значит, что это дорогое заявление.
Дорогое дело - это вопрос мнения ... если ваш сервер находится на некотором расстоянии, у вас все еще есть два ненужных возврата.
Я сделал явное conn.commit после команды, счетчик строк сказал, что все в порядке, но, глядя на это за пределами этого приложения, он потерпел неудачу. Установка его на автоматическую фиксацию сделала свое дело. Не знаю, ошибка ли это: но спасибо ıu - мне очень помогло !!
Включение автоматической фиксации может быть выполнено непосредственно при подключении к базе данных:
import mysql.connector as db
conn = db.connect(host = "localhost", user = "root", passwd = "pass", db = "dbname", autocommit=True)
MySQLConnection.autocommit Свойство
Или отдельно:
import MySQLdb
conn = MySQLdb.connect(host = "localhost", user = "root", passwd = "pass", db = "dbname")
cursor = conn.cursor()
conn.get_autocommit() # will return **False**
conn.autocommit = True
conn.get_autocommit() # Should return **True** now
cursor = conn.cursor()
Явная фиксация изменений выполняется с помощью
conn.commit()
Я считаю это удобным, потому что вам не нужно вручную управлять откатом, если что-то пойдет не так. Если вам нужно несколько запросов для обновления базы данных.