2

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

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

姜戈抱怨说

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

删除 CAST 或使用或转义引号都无济于事。

想法?

4

3 回答 3

2

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

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

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

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

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

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

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

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

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

于 2013-08-08T22:20:00.743 回答
1

我完全错过了我之前回答的重点。这是一个 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%作为参数传递的替换......

于 2013-08-09T08:49:34.493 回答
-1

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


查看我系统上的代码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);")
于 2013-08-08T21:59:04.043 回答