我不理解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))
Run Code Online (Sandbox Code Playgroud)
Mar*_*ers 22
你逃脱%%,但然后使用字符串格式化第一:
"...." % table,
Run Code Online (Sandbox Code Playgroud)
返回一个新字符串,其中%%转义的百分比由单个%字符替换.MySQL数据库适配器(AB)使用字符串格式化% 过,所以它会采取输出,并希望能够填补%s插槽逃脱SQL文本.在那里,您'%Y-%m-%d'的SQL语句部分将再次被解释为字符串格式并引发错误.
解决方案是将倍增加倍:
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,))
Run Code Online (Sandbox Code Playgroud)
或使用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,))
Run Code Online (Sandbox Code Playgroud)
这里{0}用表名替换,%%转义不变; 数据库适配器将使用%s插槽填充blockid参数并返回一个SQL语句,其中%%转义%符转换为单个字符.