从Django调用MySQL中的DATE_FORMAT()失败

时间:2013-08-08 21:39:58

标签: mysql django mysql-python

我可以运行SET语句来分配变量并使用“transaction”来在mySQL会话中维护它,但是当我像这样包含函数DATE_FORMAT时:

cursor.execute("SET @dowToday:=CAST( DATE_FORMAT( NOW(), '%w' ) AS UNSIGNED);")

Django抱怨

  

执行中的/usr/lib/pymodules/python2.6/MySQLdb/cursors.py中的格式字符串参数不足,第151行

删除CAST或使用或转义引号无效。

思想?

3 个答案:

答案 0 :(得分:1)

我的猜测是问题在于查询文本中的百分号(%)。 (这不是Django中的绑定变量占位符吗?),例如如果我们要使用绑定变量,那么看起来不会是这样吗?

SELECT 'foo' FROM DUAL WHERE 'a' = %(varname)s ;

我想也许Django正在扫描你的SQL文本并遇到%w并希望它是一个绑定变量。要么是,要么运行sprintf样式函数,并且遇到%w并期望用参数值替换该占位符。

(我没有测试过;所以这只是一个想法,只是一个猜测。)

作为一种解决方法的猜测,也许你将百分号加倍,同样我们通过sprintf获得%literals:

  query("SELECT ... ,'%%w') ...");

如果这不起作用,那么也许它是一个反斜杠字符,同样我们在正则表达式中转义字符:

  query("SELECT ... ,'\%w') ...");

(或者,您可能需要加倍反斜杠。这些只是基于其他软件使用的惯例的猜测。)

答案 1 :(得分:0)

您确定错误是由 调用产生的吗?


查看我系统上cursor.py的代码,这会导致:

def execute(self, query, args=None):

    # ...

    if isinstance(query, unicode):
        query = query.encode(charset)
    if args is not None:
        query = query % db.literal(args)         # Line 151

根据这一点,如果args不是None,则只能抛出此异常 - 考虑到呼叫,这似乎是不可能的:

cursor.execute("SET @dowToday:=CAST( DATE_FORMAT( NOW(), '%w' ) AS UNSIGNED);")

答案 2 :(得分:0)

我完全错过了我之前回答的观点。这是一个Django游标。不是“标准Python”。

根据文件:

https://docs.djangoproject.com/en/dev/topics/db/sql/

  

请注意,如果要在查询中包含文字百分号,   在传递参数的情况下,你必须加倍它们:

cursor.execute("SELECT foo FROM bar WHERE baz = '30%%' and id = %s", [self.id])

我认为如果这不起作用,你可能会回到一些简单而愚蠢的伎俩:

cursor.execute("SET @dowToday:=CAST( DATE_FORMAT( NOW(), '%sw' ) AS UNSIGNED);", ['%'])

%s将替换为作为参数传递的% ...