2010-11-10 7 views
6

Tengo este código ..Python y MySQLdb - El uso de DROP TABLE IF EXISTS parece arrojar una excepción

..... 
try: 
    task_db.cursor.execute('DROP TABLE IF EXISTS `tasks`') 
    print "Affected: %d" % task_db.cursor.rowcount 
except MySQLdb.Error, e: 
    print "Error ocurred: %s " % e.args[0] 
    print e 

Si no existe la tabla de tareas, cuando me siento un mensaje de advertencia como

create_database.py:11: Warning: Unknown table 'tasks' 

Pero si la tabla existe, entonces no recibiré esa advertencia. ¿Impar?

Respuesta

6

Es un comportamiento perfectamente correcto. Si la tabla existe, entonces se cae. Si no existe, entonces obtiene Advertencia excepción que no es lo mismo que Error - puede ignorarlo y no debe pasar nada malo, pero tiene que atraparlo para permitir que su script avance.

EDIT:

Para evitar Advertencia de burbujeo, simplemente ponerse como cualquier otra excepción:

try: 
    [some code] 
except MySQLdb.Warning: 
    [exception handling code] 
+0

Soo ... cuál es una manera de evitar que se muestre en la salida? – Wizzard

+0

Edité mi respuesta –

+5

Capturando MySQLdb. Advertencia no hizo nada por mí. Ver [respuesta de thomdask] (http://stackoverflow.com/a/4830497/307705) para una solución alternativa. –

22

La captura de la MySQLdb.Warning no funcionó para mí, así que he encontrado otra manera de suprimir advertencias:

import warnings 
warnings.filterwarnings("ignore", "Unknown table.*") 

Y puede editar el segundo parámetro con lo que desee suprimir.

11

La forma más elegante de evitar las advertencias de MySQL:

from warnings import filterwarnings 
import MySQLdb 

filterwarnings('ignore', category = MySQLdb.Warning) 
+3

Es de hecho más elegante que la respuesta thomdask pero, ¿no afectaría también a otras advertencias que no queremos ignorar? –

+0

@Roman, creo que es un punto importante, así que no diría que esta solución es más elegante. Es simplemente diferente, suprimir todas las advertencias vs suprimir una advertencia específica. – chishaku