Исправление ошибок 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")