如何在Django中获取MySQL查询产生的警告信息
Django Admin 读取MySQL执行警告的解决方案
错误原因
Django封装的数据库游标并非MySQL官方驱动的原生游标实例,因此没有内置的fetchwarnings方法,直接调用会抛出属性不存在错误。
可行实现方案
方案1:直接执行SHOW WARNINGS查询(通用兼容)
该方案不依赖驱动提供的API,直接通过MySQL原生指令读取警告,适配所有MySQL驱动:
from django.db import connection query = "DELETE IGNORE FROM 你的表名 WHERE 筛选条件" with connection.cursor() as cursor: # 执行删除语句 cursor.execute(query) # 执行原生指令获取所有警告 cursor.execute("SHOW WARNINGS") # 读取警告结果 warnings = cursor.fetchall() return warnings
返回的warnings是元组列表,每个元组结构为 (警告等级, 错误码, 错误描述),外键约束删除失败对应的错误码为1451,可自行筛选处理。
方案2:获取原生游标调用API
如果你确定使用的是mysql-connector-python驱动,可以通过Django游标拿到原生驱动实例调用对应方法:
from django.db import connection query = "DELETE IGNORE FROM 你的表名 WHERE 筛选条件" # 开启警告记录 connection.get_warnings = True with connection.cursor() as cursor: # 获取原生驱动游标 native_cursor = cursor.connection.cursor() native_cursor.execute(query) # 调用原生方法读取警告 warnings = native_cursor.fetchwarnings() return warnings
注意事项
DELETE IGNORE的返回值仅为成功删除的行数,不会包含因约束跳过的条目数量,必须通过警告信息才能获取删除失败的记录详情。- 若需要精准定位删除失败的具体条目,可以从警告描述的文本中提取对应主键、外键值匹配。
内容的提问来源于stack exchange,提问作者IndigoFenix
相关产品推荐
相关产品推荐

