Django调试模式下Sql执行的差异

版权所有,转载请注明出处:http://guangboo.org/2013/02/01/caught-typeerror-while-rendering-not-enough-arguments-for-format-string

django在执行SQL语句时,在DEBUG模式下与非DEBUG模式下,将表现不同的结果,甚至会出现异常:“Caught TypeError while rendering: not enough arguments for format string”。

这样的现象应该是django在处理SQL语句时,对SQL中出现“%”符号的解析错误。如博客归档的SQL:

SELECT DATE_FORMAT(create_date, '%b %Y') AS yearmonth, COUNT(*) AS count,YEAR(create_date) AS year,
MONTH(create_date) AS month 
FROM blog_post 
GROUP BY YEAR(create_date),MONTH(create_date) 
ORDER BY year DESC,month DESC

该SQL在DEBUG=False的情况下,可以正常执行,编写正常结果。但当DEBUG=True时,却会报“Caught TypeError while rendering: not enough arguments for format string”异常。在网上搜索了一下该异常,解决方法是将SQL语句中的“%”改成“%%”,即需要用“%”符号进行转义,这样就可以在DEBUG=True的情况下正常执行。但一旦将DEBUG设为False,该SQL可以正常执行,但是结果却是“%d %Y ...”,"%%"被转义成单个"%"。

因此,一个hack方法就是根据DEBUG的值使用不同的SQL:

if settings.DEBUG:
        sql = """SELECT DATE_FORMAT(create_date, '%%b %%Y') AS yearmonth, COUNT(*) AS count,YEAR(create_date) AS year,MONTH(create_date) AS month 
FROM blog_post GROUP BY YEAR(create_date),MONTH(create_date) 
ORDER BY year DESC,month DESC"""
    else:
        sql = """SELECT DATE_FORMAT(create_date, '%b %Y') AS yearmonth, COUNT(*) AS count,YEAR(create_date) AS year,MONTH(create_date) AS month 
FROM blog_post GROUP BY YEAR(create_date),MONTH(create_date) 
ORDER BY year DESC,month DESC"""
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值