2014-02-12 10 views
12

Ich habe ein kleines/einfaches Python-Skript erstellt, um Daten in eine MySQL-Datenbank einzufügen. Ich habe eine Fehlerbehandlung eingebaut - hauptsächlich, um die Verbindung zu schließen und/oder hängende Verbindungen im Falle eines Fehlers zu verhindern (... aber auch einige Fehler zu ignorieren).Korrekte Ausnahmebehandlung mit Python MySQLdb-Verbindung

Ich dachte, was ich hatte (siehe unten) hatte Recht - es schien in Ordnung zu sein. Aber gelegentlich habe ich "Too many connection" -Fehler bekommen - was ich annehme, bedeutet, dass ich die Verbindung überhaupt nicht richtig schließe (oder vielleicht ist die Fehlerbehandlung nicht richtig).

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() 

(Ich habe auch versucht, ohne finally:)

Die andere (ich glaube, wichtig) ist, dass es ist, dass die MySQL-Datenbank einen Speicher-Engine InnoDB verwendet. Dies ist das erste Mal, dass ich InnoDB-Engine verwendet habe und vielleicht gibt es einige Unterschiede zu MyISAM, die hier relevant sind, die mir nicht bekannt sind (wie conn.commit(), aber für einen Fehler) .... Das scheint die Quelle von allem zu sein meine anderen Probleme!

Vielen Dank im Voraus

+0

Sie sollten die 'conn.close()' aus dem 'try' -Hauptteil entfernen, da sie _immer_ innerhalb des' finally'-Rumpfs aufgerufen wird. Abgesehen davon sieht es so aus, als ob Sie Ihre Verbindungen richtig freigeben. – lanzz

+0

Danke Lanzz - Entschuldigung, ich habe einen Fehler beim Kopieren des Codes gemacht (spielte ohne 'finally:', und hatte einen 'conn.close()' im 'try' body ** und ** the' except' body). Haben Sie die Frage behoben (immer noch das gleiche Problem) – djmac

Antwort

4

Ich glaube, die Frage war ich nicht conn.rollback() in der except Klausel (und folglich wurde die Verbindung geschlossen wird nicht richtig) Aufrufen wurde. Eine Zeile (siehe unten) schien, um das Problem zu beheben (ich kann nicht genau sicher sein, wenn das das Problem war - wenn jemand bestätigen könnte, wäre toll).

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()