Подтвердить что ты не робот

Исправлена ​​обработка исключений с использованием соединения python MySQLdb

Я создал небольшой/базовый python script для вставки данных в базу данных MySQL. Я включил некоторую обработку ошибок - главным образом, чтобы закрыть соединение и/или предотвратить зависание соединений в случае ошибки (... но также игнорировать некоторые ошибки).

Я думал, что у меня было (см. ниже), было правильно - казалось, что все в порядке. Но иногда я получаю ошибки "Слишком много соединений", которые, как я полагаю, означает, что я вообще не закрываю соединение правильно (или, возможно, обработка ошибок неверна).

conn=MySQLdb.connect(host=####, user=####, passwd=####, db=####)
curs=conn.cursor()
try:
    curs.execute(sql)
    conn.commit()           

except MySQLdb.Error as e:
    if e[0]!= ###:
        raise

finally: 
    curs.close()    
    conn.close()

(Я также пробовал без finally:)

Другая (я думаю, важная) точка заключается в том, что база данных MySQL использует механизм хранения InnoDB. Это первый раз, когда я использовал движок InnoDB и, возможно, есть некоторые отличия от MyISAM, которые здесь актуальны, что я не знаю (например, conn.commit(), но для ошибки).... Это похоже на источник всех моих других проблем!

Заранее спасибо

4b9b3361

Ответ 1

Я считаю, что проблема заключалась в том, что я не вызывал conn.rollback() в предложении except (и, следовательно, соединение не закрывалось должным образом). Одна строка (см. Ниже) показалась, чтобы исправить проблему (я не могу быть точно уверен, что это была эта проблема - если кто-то мог подтвердить, что это будет здорово).

conn=MySQLdb.connect(host=####, user=####, passwd=####, db=####)
curs=conn.cursor()
try:
    curs.execute(sql)
    conn.commit()           

except MySQLdb.Error as e:
    conn.rollback()              #rollback transaction here
    if e[0]!= ###:
        raise

finally: 
    curs.close()    
    conn.close()