捕获MySql警告
在我的Python脚本中,我想在使用MySql查询时捕捉到“数据被截断,列名为'xxx'”的警告。
我看到一些帖子推荐了下面的代码,但它并没有起作用。
你们知道是否需要导入某个特定的模块,或者在使用这段代码之前是否需要调用某个选项或标志吗?
谢谢大家
Afeg
import MySQLdb
try:
cursor.execute(some_statement)
# code steps always here: No Warning is trapped
# by the code below
except MySQLdb.Warning, e:
# handle warnings, if the cursor you're using raises them
except Warning, e:
# handle warnings, if the cursor you're using raises them
7 个回答
我建议你先设置一下 sql_mode
。你可以在会话级别进行设置,也就是说在你开始连接数据库后就可以调整这个设置。如果你执行了:
SET @@sql_mode:=TRADITIONAL;
(当然你也可以在服务器级别设置,但那需要你有服务器的访问权限。而且,即使在服务器上设置了,这个设置在会话级别还是可以被覆盖,所以最好的做法是,每次连接后都在会话级别设置一下)
这样的话,很多通常只是警告的事情就会变成错误。我不太清楚这些在Python中是怎么表现的,但明显的好处是,这些更改不会被存储在数据库里。详细信息可以查看这个链接:http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html#sqlmode_traditional
将MySQL的警告当作错误来处理:
import warnings, MySQLdb
warnings.filterwarnings('error', category=MySQLdb.Warning)
如果你想忽略这些警告,而不是把它们当作错误处理,可以把"error"
换成"ignore"
。
你可以像下面这样在一个try-except块中处理这些警告:
try:
# a MySQL DB operation that raises a warning
# for example: a data truncated warning
except Warning as a_warning:
# do something here
警告就是警告,它们会被报告到(通常是)错误输出,但不会有其他的处理。你不能像处理异常那样去捕捉它们,因为它们并没有被抛出。
不过,你可以设置警告的处理方式,可以选择关闭它们或者把它们变成异常,这需要用到 warnings
模块。比如,使用 warnings.filterwarnings('error', category=MySQLdb.Warning)
可以把 MySQLdb.Warning
的警告变成异常(这样你就可以用 try/except 来捕捉它们),或者用 'ignore'
来完全不显示这些警告。你可以(而且可能应该)设置更细致的过滤条件,而不仅仅是根据类别来过滤。