如何避免 MySQL 警告升级为 Django 应用程序中的异常

How to avoid MySQL warning to be escalated to an Exception in a Django application

table 中有一列为 varchar(5) 类型,它通常包含字符串格式的数字。有时它包含一些额外的字符,如 "5 CA"。我们将该列转换为数字以进行排序,这是通过额外的查询完成的:

qs.extra(select={'pnumsort':'main_person.player_number+0'}).order_by('pnumsort', "player_number")

问题是这个查询引起的警告在我的开发者盒子上升级为一个异常,所以请求失败了。警告:

Warning at /players/data/players_table/ Truncated incorrect DOUBLE value: '5 CA'

当玩家编号列的内容有一些额外的非数字字符时,每一行都会出现这样的警告。神秘之处在于,我的开发同事同事根本没有在他的盒子上收到错误(他可能有警告,但没有升级为错误)。测试系统有错误,幸好live没有。

到目前为止我发现了什么:

  1. 如果我尝试使用 qs.extra(select={'pnumsort':'CAST(main_person.player_number AS UNSIGNED)'}).order_by('pnumsort', "player_number")qs.extra(select={'pnumsort':'CONVERT(main_person.player_number, UNSIGNED)'}).order_by('pnumsort', "player_number"),我会收到相同的警告。而且由于警告,它仍然会导致我的系统出错。

  2. 有一张 5 年前的 Django 票证:https://code.djangoproject.com/ticket/12293 如果在 Django Python 应用程序中启用 DEBUG 模式,这种行为(MySql 警告升级为错误)似乎应该是正常的。但是为什么我的同事没有得到错误呢?

  3. 该行为似乎不依赖于 MySql 版本、Django 版本或 MySql-python 版本。

    box | MySql version | MySql python version | Django DEBUG | problem

    my box | 5.6.24 | 1.2.5 final | True | Yes

    colleague | 5.1 | 1.2.3 final | True | No

    test | 5.5.38 | 1.2.3 final | True | Yes

    live | 5.5.x | 1.2.5 final | False | No

  4. 我试图关闭 MySQL 严格模式(尽管不建议这样做)。我的同事在他的 sql_mode 中没有任何设置(MySql 配置设置 Disabling MySQL Strict Mode)。清除 sql_mode 也没有帮助,尽管有趣的是 PyCharm 数据库连接视图表明它为其会话 (SELECT @@SESSIon.slq_mode) 选择了 STRICT 模式。但是 PyCharm 使用 JDBC 连接到 MySQL,所以它与 Django 和 MySQL-python.

    [=67= 完全不同]

如何避免我的盒子和测试服务器上的错误(由于 MySQL 警告)?为什么我的同事没有这个问题?

服务器 Linux,开发环境 Windows。

在执行查询之前,您可以在某处使用类似这样的代码来忽略警告。

from warnings import filterwarnings
import MySQLdb as Database
filterwarnings('ignore', message="^Truncated incorrect DOUBLE value:.*", 
                category = Database.Warning)

有关详细信息,请参阅 https://docs.python.org/2/library/warnings.html