想在线检查MySQL SQL语句是否存在错误,但又不想实际的执行SQL语句,自然而然的想到了在SQL语句前添加EXPLAIN关键字,之后再来运行检测。在mysql客户端对于表不存在,关键字错误这样的语法错误以及函数不存在列名不存在这样的语义错误均可以有效报出。然而当使用MySQLdb客户端工具连接MySQL执行加了EXPLAIN关键字的SQL语句后在try...except...语句中只能捕获到语法错误(syntax error),而捕获不到列名不存在、函数不存在这样的错误。这一点要注意。
比如在mysql客户端,添加explain和不添加explain执行的结果是一样的对于包含错误的语句报出同样的错误信息。
然而在SQL语句前添加了EXPLAIN关键字后下面的代码却只能捕获到严格意义上的语法错误,对于函数不存在、列名不存在这样的错误不能捕获到,必须实际执行语句本身才可以。
import MySQLdb
from warnings import filterwarnings
filterwarnings('error', category = MySQLdb.Warning)
def checkSqlError(sql, conn, cursor):
sqlSyntaxProblem={}
sqlSyntaxProblem['warning']=''
sqlSyntaxProblem['error']=''
sqlWarning = ''
sqlError = ''
try:
cursor.execute(sql)
result = cursor.fetchall()
conn.rollback()
except MySQLdb.Warning, w:
sqlWarning = "Warning:%s" % str(w)
except MySQLdb.Error, e:
sqlError = "Error %d:%s" % (e.args[0], e.args[1])
if sqlWarning:
sqlSyntaxProblem['warning']= sqlWarning
if sqlError:
sqlSyntaxProblem['error']= sqlError
return sqlSyntaxProblem