Оператор assert в следующем коде не работает в среде, на которой запущен mariadb, в то время как он отлично работает в (более старой) среде с запуском mysql. Похоже, что среда mariadb не сохраняет результат инструкции insert. Соединение с клиентом командной строки подтверждает, что вставка не была сохранена.Python MySQLdb Вставка завершается с ошибкой в MariaDB: не сохраняется новое подключение
import MySQLdb
def newCon():
return MySQLdb.connect('localhost', 'root', '', 'test')
def testStatement(con, aStatement):
# print "---"
# print aStatement
cur = con.cursor()
cur.execute(aStatement)
result = cur.fetchall()
cur.close()
# print result
return result
def test():
con = newCon()
testStatement(con, "DROP TABLE IF EXISTS TestTable")
testStatement(con, """CREATE TABLE TestTable (
id INT NOT NULL AUTO_INCREMENT,
AccountId VARCHAR(50),
PRIMARY KEY(id))""")
testStatement(con, "INSERT INTO TestTable (AccountId) VALUES ('XYZ')")
myCount1 = testStatement(con, "SELECT count(*) from TestTable")[0][0]
con.close()
con = newCon()
myCount2 = testStatement(con, "SELECT count(*) from TestTable")[0][0]
con.close()
assert myCount1 == myCount2, \
"count1 = " + str(myCount1) + " != count2 = " + str(myCount2)
test()
среда, в которой он работает штраф: CentOS 6,7 питон 2.6.6 MySQL-питон 1.2.3 сервер MySQL 5.1.73
среда, в которой он не является: Fedora 21 Python 2.7.8 MySQL-Python 1.2.3 MariaDB сервер 10.0.21
Неудачная выход гласит:
Test2.py:10: Warning: Table 'mysql.table_stats' doesn't exist
cur.execute(aStatement)
Traceback (most recent call last):
File "Test2.py", line 37, in <module>
test()
File "Test2.py", line 35, in test
"count1 = " + str(myCount1) + " != count2 = " + str(myCount2)
AssertionError: count1 = 1 != count2 = 0
Я не знаю, о чем предупреждает table_stats.
Вопрос: Правильно ли я использую api? Может ли кто-нибудь пройти этот тест с помощью среды mariadb?
Как совершить транзакцию? Это специфично для mariadb, или я должен был сделать это с mysql? – Olivier
Спасибо, это сработало! Окруженный INSERT с BEGIN - COMMIT – Olivier
Если 'autocommit' был включен, проблема не будет существовать. Интересно, почему это было отключено. См. Http://stackoverflow.com/questions/12059424/about-mysqldb-conn-autocommittrue –