2016-04-27 4 views
0

Оператор 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?

ответ

0

Вы не совершили сделку.

+0

Как совершить транзакцию? Это специфично для mariadb, или я должен был сделать это с mysql? – Olivier

+0

Спасибо, это сработало! Окруженный INSERT с BEGIN - COMMIT – Olivier

+0

Если 'autocommit' был включен, проблема не будет существовать. Интересно, почему это было отключено. См. Http://stackoverflow.com/questions/12059424/about-mysqldb-conn-autocommittrue –

 Смежные вопросы

  • Нет связанных вопросов^_^