2009-03-15 7 views
14

Me gustaría detectar y registrar advertencias de MySQL en Python. Por ejemplo, MySQL emite una advertencia al error estándar si envía 'DROP DATABASE IF EXISTS database_of_armaments' cuando no existe dicha base de datos. Me gustaría capturar esto y registrarlo, pero incluso en la sintaxis try/else el mensaje de advertencia aún aparece.Reventado de advertencias de MySQL en Python

La sintaxis try/except capta los errores de MySQL (por ejemplo, el envío de un error tipográfico como 'DRP DATABASE database_of_armaments').

He experimentado con <<except.MySQLdb.Warning>> - sin suerte. Miré el módulo de advertencias, pero no entiendo cómo incorporarlo en la sintaxis try/else.

Para ser concreto, ¿cómo consigo lo siguiente (o algo así) para trabajar.

DADO: la base de datos 'database_of_armaments' no existe.

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?>> 

ACTUALIZACIÓN:

Gracias por los comentarios. Había probado esto y no funcionaba, pero había estado usando una clase DatabaseConnection que escribí para una conexión, y su método runQuery() para ejecutar. Cuando creé una conexión y un cursor fuera de la clase, la Excepción try/except captó el "Error de programación", y excepto que MySQLdb.ProgrammingError funcionó según lo anunciado.

Así que ahora tengo que descubrir cuál es el problema con la codificación de mi clase.

Gracias por su ayuda.

+1

no he encontrado ninguna de las las respuestas aquí son útiles, pero fue http://stackoverflow.com/a/2102315/91238. – arantius

Respuesta

15

Siga estos pasos.

  1. Ejecútelo con except Exception, e: print repr(e).

  2. Mira qué excepción obtienes.

  3. Cambie el Exception a la excepción que realmente recibió.

Además, recuerde que la excepción, e, es un objeto. Puede imprimir dir(e), e.__class__.__name__, etc. para ver qué atributos tiene.

Además, puede hacerlo interactivamente en el indicador >>> en Python. A continuación, puede manipular el objeto directamente, sin adivinar.

+0

Esto me ayudó, ya que django usa el mismo nombre de excepción que el conector MySQL subyacente; 'OperationalError'. Cambié 'de MySQLdb import OperationalError' a' from django.db.utils import OperationalError' en la parte superior de mi archivo, y de repente pude detectar la excepción. –

7

¿Has probado algo como esto?

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 
+0

Aunque esta respuesta podría ser más exhaustiva, sigue siendo un mejor comienzo que los demás, no veo por qué se votó negativamente. –

+1

@Flav porque las advertencias no "aumentan" – g33kz0r

2

Creo que la excepción que se desea capturar es un MySQLdb.ProgrammingError, y para obtener información sobre el mismo, sólo tiene que añadir una variable para almacenar los datos de error (una tupla) después de que decir:

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) 
+0

¿No te refieres a MySQLdb.OperationalError (en lugar de ProgrammingError)? – elo80ka

+0

Esta es la excepción que me lanzaron en un proyecto similar en el que estoy trabajando. Y sí, pensé que era extraño. – dangerouslyfacetious

+0

Gracias, esto fue útil. – chernevik

1

primero debe activar las advertencias para tratar como excepciones, y solo así podrá verlas. vea el módulo de "advertencias" estándar para más detalles.

0

Así de simple

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] ejemplo: - (u'Warning', 1366L, u"Incorrect integer value: '\xa3' for column 'in_userid' at row 1")

1

que lograron controlar la advertencia de MySQL así:

import _mysql_exceptions 

try: 
    foo.bar() 
except _mysql_exceptions.Warning, e: 
    pass 
Cuestiones relacionadas