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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
39
0
36 691
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

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

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

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

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

Sergei 12.08.2016 00:34

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

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

Я хочу знать, почему я включил автоматическую фиксацию в mysql, но мне тоже нужен conn.commit()?

Tangwz 23.08.2017 14:35

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

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

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

Установка conn.autocommit (true) после подключения означает, что он отправляет на сервер две лишние команды - было бы лучше, если бы был способ их избежать.

MarkR 21.12.2008 17:54

это было бы было бы лучше, если бы был такой способ, согласен. но это не значит, что это дорогое заявление.

ʞɔıu 22.12.2008 03:30

Дорогое дело - это вопрос мнения ... если ваш сервер находится на некотором расстоянии, у вас все еще есть два ненужных возврата.

MarkR 22.12.2008 10:47

Я сделал явное conn.commit после команды, счетчик строк сказал, что все в порядке, но, глядя на это за пределами этого приложения, он потерпел неудачу. Установка его на автоматическую фиксацию сделала свое дело. Не знаю, ошибка ли это: но спасибо ıu - мне очень помогло !!

David Hall 05.04.2011 23:42

Аргументы соединения коннектора / Python

Включение автоматической фиксации может быть выполнено непосредственно при подключении к базе данных:

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

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