Исправление ошибок MySQL в Python
Я хотел бы поймать и зарегистрировать предупреждения MySQL в Python. Например, MySQL выдает предупреждение стандартной ошибке, если вы отправляете 'DROP DATABASE IF EXISTS database_of_armaments'
, когда такая база данных не существует. Я хотел бы поймать это и зарегистрировать его, но даже в синтаксисе try/else предупреждение появляется еще.
Синтаксис try/except вызывает ошибки MySQL (например, представление опечатки типа 'DRP DATABASE database_of_armaments'
).
Я экспериментировал с <<except.MySQLdb.Warning>>
- не повезло. Я просмотрел модуль предупреждений, но не понимаю, как включить его в синтаксис try/else.
Чтобы быть конкретным, как мне получить следующее (или что-то вроде этого) для работы.
GIVEN: базы данных "database_of_armaments" не существует.
try:
cursor.execute('DROP DATABASE IF EXISTS database_of_armaments')
except: <<WHAT DO I PUT HERE?>>
print 'There was a MySQL warning.'
<<AND what goes here if I want to get and manipulate information about the warning?>>
UPDATE:
Спасибо за комментарии. Я пробовал их, но они не работали, но я использовал класс DatabaseConnection, который я написал для подключения, и его метод runQuery() для выполнения. Когда я создал соединение и курсор вне класса, try/except Exception уловил "Ошибка программирования", и кроме MySQLdb.ProgrammingError работал как рекламируемый.
Итак, теперь я должен выяснить, что не так с моим классом.
Благодарим вас за помощь.
Ответы
Ответ 1
Выполните следующие действия.
-
Запустите его с помощью except Exception, e: print repr(e)
.
-
Посмотрите, какое исключение вы получите.
-
Измените Exception
на исключение, которое вы действительно получили.
Также помните, что исключение, e, является объектом. Вы можете распечатать dir(e)
, e.__class__.__name__
и т.д., Чтобы увидеть, какие атрибуты у него есть.
Кроме того, вы можете сделать это в интерактивном режиме в приглашении >>>
в Python. Затем вы можете напрямую манипулировать объектом - никаких угадываний.
Ответ 2
Вы пробовали что-то вроде этого?
try:
cursor.execute(some_statement)
except MySQLdb.IntegrityError, e:
# handle a specific error condition
except MySQLdb.Error, e:
# handle a generic error condition
except MySQLdb.Warning, e:
# handle warnings, if the cursor you're using raises them
Ответ 3
Я думаю, что исключение, которое вы хотите поймать, это MySQLdb.ProgrammingError, и для получения информации об этом просто добавьте переменную, чтобы сохранить данные об ошибках (кортеж) после этого i.e:
try:
cursor.execute('DROP DATABASE IF EXISTS database_of_armaments')
except MySQLdb.ProgrammingError, e:
print 'There was a MySQL warning. This is the info we have about it: %s' %(e)
Ответ 4
сначала вы должны включить предупреждения, которые будут рассматриваться как исключения, и только тогда вы сможете их поймать.
см. стандартный модуль предупреждений.
Ответ 5
Мне удалось замаскировать предупреждение mysql следующим образом:
import _mysql_exceptions
try:
foo.bar()
except _mysql_exceptions.Warning, e:
pass
Ответ 6
Обычный и простой
def log_warnings(curs):
for msg in curs.messages:
if msg[0] == MySQLdb.Warning:
logging.warn(msg[1])
cursor.execute('DROP DATABASE IF EXISTS database_of_armaments')
log_warnings(cursor)
msg [1] пример: - (u'Warning', 1366L, u"Incorrect integer value: '\xa3' for column 'in_userid' at row 1")