如何避免 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没有。
到目前为止我发现了什么:
如果我尝试使用 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")
,我会收到相同的警告。而且由于警告,它仍然会导致我的系统出错。
有一张 5 年前的 Django 票证:https://code.djangoproject.com/ticket/12293
如果在 Django Python 应用程序中启用 DEBUG 模式,这种行为(MySql 警告升级为错误)似乎应该是正常的。但是为什么我的同事没有得到错误呢?
该行为似乎不依赖于 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
我试图关闭 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)
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没有。
到目前为止我发现了什么:
如果我尝试使用
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")
,我会收到相同的警告。而且由于警告,它仍然会导致我的系统出错。有一张 5 年前的 Django 票证:https://code.djangoproject.com/ticket/12293 如果在 Django Python 应用程序中启用 DEBUG 模式,这种行为(MySql 警告升级为错误)似乎应该是正常的。但是为什么我的同事没有得到错误呢?
该行为似乎不依赖于 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
我试图关闭 MySQL 严格模式(尽管不建议这样做)。我的同事在他的
[=67= 完全不同]sql_mode
中没有任何设置(MySql 配置设置 Disabling MySQL Strict Mode)。清除sql_mode
也没有帮助,尽管有趣的是PyCharm
数据库连接视图表明它为其会话 (SELECT @@SESSIon.slq_mode
) 选择了 STRICT 模式。但是 PyCharm 使用 JDBC 连接到 MySQL,所以它与 Django 和 MySQL-python.
如何避免我的盒子和测试服务器上的错误(由于 MySQL 警告)?为什么我的同事没有这个问题?
服务器 Linux,开发环境 Windows。
在执行查询之前,您可以在某处使用类似这样的代码来忽略警告。
from warnings import filterwarnings
import MySQLdb as Database
filterwarnings('ignore', message="^Truncated incorrect DOUBLE value:.*",
category = Database.Warning)