2014-02-12 22 views
12

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

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

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(), но для ошибки) .... Это, кажется, источник всех мои другие проблемы!

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

+0

Вы должны удалить 'conn.close()' из тела 'try', так как он будет вызываться _allways_ внутри тела' finally'. Помимо этого, похоже, что вы правильно освобождаете свои подключения. – lanzz

+0

Спасибо Lanzz - извините, что я сделал ошибку при копировании кода (играл без 'finally:' и имел 'conn.close()' в 'try' body ** и ** тело' except'). Устранил вопрос (все еще есть одна и та же проблема, в любом случае) – djmac

ответ

4

Я считаю, что этот вопрос я не вызовом 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() 
Смежные вопросы