【问题标题】:Python => ValueError: unsupported format character 'Y' (0x59)Python => ValueError:不支持的格式字符'Y'(0x59)
【发布时间】:2013-05-13 21:04:29
【问题描述】:

我不明白 Y 的 ValueError。我用 %... 转义...

table = town+"_history"
db.execute("SELECT DATE_FORMAT(snapdate,'%%Y-%%m-%%d') AS date, SUM( population ) AS accountpopulation, count( blockid ) AS number_block FROM %s WHERE blockid =%%s GROUP BY snapdate ORDER BY snapdate DESC LIMIT 7" % table, (blockid))

【问题讨论】:

  • 您能提供更多信息吗?桌子上有什么?传递给结果格式字符串的内容(即,给具有“%Y”的字符串的内容是什么?
  • @SethMMorton:MySQL DATE_FORMAT() 函数需要一个使用%Y 等格式代码的格式字符串。但是使用%运算符的Python字符串格式化操作也是如此,支持%s SQL参数的MySQL数据库也是如此通过使用%运算符的字符串格式化

标签: python mysql


【解决方案1】:

您转义了%%,然后将字符串用作格式化程序首先

"...." % table,

返回一个新字符串,其中%% 转义百分比被单个% 字符替换。 MySQL 数据库适配器 (ab) 使用带有 % too 的字符串格式,因此它将获取该输出并期望能够用转义的 SQL 文字填充 %s 槽。在那里,您的 SQL 语句的 '%Y-%m-%d' 部分再次被解释为字符串格式并引发错误。

解决办法是加倍加倍:

db.execute("SELECT DATE_FORMAT(snapdate,'%%%%Y-%%%%m-%%%%d') AS date, SUM( population ) AS accountpopulation, count( blockid ) AS number_block FROM %s WHERE blockid = %%s GROUP BY snapdate ORDER BY snapdate DESC LIMIT 7" % table, (blockid,))

或改用str.format(),避免双重转义:

db.execute("SELECT DATE_FORMAT(snapdate,'%%Y-%%m-%%d') AS date, SUM( population ) AS accountpopulation, count( blockid ) AS number_block FROM {0} WHERE blockid = %s GROUP BY snapdate ORDER BY snapdate DESC LIMIT 7".format(table), (blockid,))

这里{0} 被表名替换,%% 转义保持不变;数据库适配器将使用%s 槽填充blockid 参数并返回一条SQL 语句,其中%% 转义变成单个% 字符。

【讨论】:

  • 第一个解决方案 => TypeError: Decimal('220') is not JSON serializable。第二个 ==> ValueError:格式中的零长度字段名称。
  • @OlZ:是什么把它变成了 JSON?你得到的回溯是什么?而如果你使用的是 Python 2.6,则需要使用{0} 作为字段占位符。
  • @OlZ: 第一个错误听起来像数据库查询 succeeded 但您正在尝试使用 JSON 序列化字节数据。那将是一个 问题;此代码有效。
  • 我使用 python 框架 => bottle.py 是的,我使用的是 Python 2.6
  • 如果您现在得到的只是TypeError: Decimal('220') is not JSON serializable. 错误,那么这超出了我可以帮助您的范围;您现在解决了数据库问题并找到了一个新问题,但您必须就此提出一个新问题。包括代码和一个完整的回溯(不仅仅是最后的异常消息)。
【解决方案2】:

最后,@Martijn Pieters 你是完全正确的。并感谢您的有用回答。另一个错误来自 SUM 和 COUNT。 Python 在处理 JSON 时有时会以一种疯狂的方式运行。所以完整的答案是:

db.execute("SELECT DATE_FORMAT(snapdate,'%%%%Y-%%%%m-%%%%d') AS date, CAST(SUM( population ) AS CHAR ) AS accountpopulation, CAST(count( blockid ) AS CHAR) AS number_block FROM %s WHERE blockid = %%s GROUP BY snapdate ORDER BY snapdate DESC LIMIT 7" % table, (blockid,))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-17
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    • 2013-10-28
    相关资源
    最近更新 更多