Кто бросает (и ловит) это исключение MySQL? - PullRequest
8 голосов
/ 18 февраля 2010

Я использую Python с MySQL и Django.Я продолжаю видеть эту ошибку, и я не могу понять, где выбрасывается исключение:

Exception _mysql_exceptions.ProgrammingError: (2014, "Commands out of sync; you can't run this command now") in <bound method Cursor.__del__ of <MySQLdb.cursors.Cursor object at 0x20108150>> ignored

У меня есть много «try» и «exception»блоки в моем коде - если исключение произошло в одном из них, я бы увидел свои собственные сообщения отладки.Вышеуказанное Исключение, очевидно, где-то ловится, поскольку моя программа не прерывается, когда выдается Исключение.

Я очень озадачен, может кто-нибудь мне помочь?

Ответы [ 5 ]

8 голосов
/ 24 августа 2012

У меня была именно эта ошибка (с использованием MySQLdb и Django) и я обнаружил, что причина, по которой она была "проигнорирована", заключалась в том, что она произошла методом __del__. Исключения в __del__ категорически игнорируются: object.__del__ модель данных

Кажется, нет никакого способа поймать его из дальнейшего стека (по крайней мере, согласно этой теме ), но вы можете отредактировать MySQLdb / cursors.py или monkey-patch, чтобы получить там находится ваш собственный __del__, который перехватывает исключение и помещает вас в приглашение pdb или регистрирует полный возврат.

3 голосов
/ 18 февраля 2010

Это ошибка Python.

См .: http://eric.lubow.org/2009/python/pythons-mysqldb-2014-error-commands-out-of-sync/

Похоже, что проблема с вашим MySQLdb Query.

2 голосов
/ 20 февраля 2010

После распечатки множества вещей и отладки я понял проблему, я думаю.Одна из библиотек, которую я использовал, не закрывала соединение или курсор.Но эта проблема появляется, только если я перебираю большой объем данных.Проблема также очень прерывистая, и я до сих пор не знаю, кто выдает исключение «команда из синхронизации»Но теперь, когда мы закрыли соединение и курсор, я больше не вижу ошибок.

2 голосов
/ 18 февраля 2010

Я полагаю, что эта ошибка может возникнуть, если вы используете одно и то же соединение / курсор из нескольких потоков. Однако я не думаю, что создатели Django допустили такую ​​ошибку, но если вы делаете что-то самостоятельно, это легко может произойти.

0 голосов
/ 28 марта 2019

Исключения в деструкторах объектов (__del__) игнорируются, что указывает это сообщение. Если вы выполняете какую-либо команду MySQL без извлечения результатов из курсора (например, «создать процедуру» или «вставить»), то исключение остается незамеченным до тех пор, пока курсор не будет уничтожен. Если вы хотите вызвать и перехватить исключение, явно вызовите где-нибудь cursor.close(), прежде чем выходить из области видимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...