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


person Ian Burris    schedule 21.12.2008    source източник


Отговори (5)


Не съм сигурен, но предполагам, че използвате INNODB таблица и не сте направили ангажимент. Вярвам, че MySQLdb позволява транзакции автоматично.

Обадете се на conn.commit(), преди да се обадите на close.

От ЧЗВ: Започвайки с 1.2 .0, MySQLdb забранява автоматичното подаване по подразбиране

person Zoredache    schedule 21.12.2008
comment
Намирам го за удобно, защото не е нужно да управлявате връщането назад ръчно, ако нещо се обърка. В случай, че имате нужда от няколко заявки за актуализиране на базата данни. - person Sergei; 12.08.2016

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

Можете или да направите conn.commit() след оператора за актуализиране, както посочиха други, или да деактивирате напълно тази функционалност, като зададете conn.autocommit(True) веднага след като създадете обекта за връзка.

person ʞɔıu    schedule 21.12.2008
comment
Задаването на conn.autocommit(true) след свързване означава, че изпраща две излишни команди към сървъра - би било по-добре, ако имаше начин да ги избегнете. - person MarkR; 21.12.2008
comment
би било по-добре, ако имаше такъв начин, съгласен съм. но не е като скъпо изявление. - person ʞɔıu; 22.12.2008
comment
Скъпото е въпрос на мнение... ако вашият сървър е на известно разстояние, все още имате две ненужни двупосочни пътувания. - person MarkR; 22.12.2008
comment
Направих изричен conn.commit след команда, броячът на редовете каза, че всичко е наред, но като го гледах извън това приложение, беше неуспешно. Настройването му на автоматично ангажиране свърши работа. Не знам дали това е грешка: но благодаря ʞɔıu -- помогна ми много!! - person David Hall; 05.04.2011

Трябва да извършите промените ръчно или да включите автоматичното ангажиране.

Причината SELECT да връща модифицираните (но не запазени) данни е, че връзката все още е в същата транзакция.

person muhuk    schedule 21.12.2008
comment
Искам да знам защо включих автоматичното ангажиране в mysql, но също трябва да conn.commit()? - person Tangwz; 23.08.2017

Открих, че конекторът на Python автоматично изключва автоматичното ангажиране и изглежда няма начин да се промени това поведение. Разбира се, можете да го включите отново, но след като гледате регистрационните файлове на заявките, той глупаво прави две безсмислени заявки след свързване, за да изключи автоматичното подаване и след това да го включи отново.

person MarkR    schedule 21.12.2008

Аргументи за свързване на конектор/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()
person Milovan Tomašević    schedule 21.01.2021