我可以运行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或使用或转义引号无效。
思想?
答案 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
将替换为作为参数传递的%
...