2010-11-09 2 views
3

У меня есть ошибка, что я не знаю, как исправить или даже воспроизвести:Python, MySQL и странная ошибка

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

где класс Database содержит:

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

Это как Я открываю подключение к базе данных:

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

Это StackTrace ошибки:

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 

У вас есть идеи, почему это происходит и как я могу это исправить? Я искал в Интернете, и я узнал, что причина может быть с двумя курсорами, но у меня есть только одна.

+1

Вы всегда должны поймать конкретные ошибки; не используйте 'except:'. Это поймает такие вещи, как KeyboardInterrupt. – katrielalex

ответ

3

попробовать это в вашем TRACEBACK это для отладки:

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

Спасибо, это помогло. Я узнал, что ошибка «MySQL server умер», и я искал возможные проблемы. Кажется, что я должен закрыть курсоры после запроса и подключения к базе данных (я полагал, что MySQL сделает это автоматически после таймаута). –

+0

@ Laurenţiu Dascălu: рад, что это вам поможет :) – mouad

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