2010-11-09 6 views
3

j'ai un bug que je ne sais pas comment réparer ou même reproduire:Python, MySQL et une erreur bizarre

query = "SELECT id, name FROM names ORDER BY id" 
results = database.execute(query) 

où la classe Database contient:

def execute(self, query): 
    cursor = self.db.cursor() 
    try: 
     cursor.execute(query) 
     return cursor.fetchall() 
    except: 
     import traceback 
     traceback.print_exc(file=debugFile) 
     return [] 

Voici comment J'ouvre la connexion de base de données:

self.db = MySQLdb.connect(
    host=mysqlHost, 
    user=mysqlUser, 
    passwd=mysqlPasswd, 
    db=mysqlDB 
) 

C'est le stacktrace de l'erreur:

File "foo.py", line 169, in application results = config.db.execute(query) 
File "Database.py", line 52, in execute 
    return cursor.fetchall() 
File "/usr/lib/pymodules/python2.6/MySQLdb/cursors.py", line 340, in fetchall 
    self._check_executed() 
File "/usr/lib/pymodules/python2.6/MySQLdb/cursors.py", line 70, in _check_executed 
    self.errorhandler(self, ProgrammingError, "execute() first") 
File "/usr/lib/pymodules/python2.6/MySQLdb/connections.py", line 35, in defaulterrorhandler 
    raise errorclass, errorvalue 
ProgrammingError: execute() first 

Avez-vous une idée de pourquoi cela se produit et comment puis-je le réparer? J'ai cherché sur Internet et j'ai découvert que la raison pourrait être d'avoir 2 curseurs, mais j'en ai seulement un.

+1

Vous devez toujours prendre des erreurs spécifiques; N'utilisez pas 'sauf:'. Cela va attraper des choses comme KeyboardInterrupt. – katrielalex

Répondre

3

essayer dans votre retraçage il est pour le débogage:

except ProgrammingError as ex: 
    if cursor: 
     print "\n".join(cursor.messages) 
     # You can show only the last error like this. 
     # print cursor.messages[-1] 
    else: 
     print "\n".join(self.db.messages) 
     # Same here you can also do. 
     # print self.db.messages[-1] 
+0

Merci, ça m'a aidé. J'ai découvert que l'erreur était "serveur MySQL est mort" et j'ai cherché des problèmes possibles. Il semble que je doive fermer les curseurs après une requête et la connexion à la base de données (je pensais que MySQL le ferait automatiquement après un timeout). –

+0

@ Laurenţiu Dascălu: heureux de vous aider :) – mouad