[英]“ValueError: Unsupported format character ' ” ' (0x22) at…" in Python / String
[英]Python => ValueError: unsupported format character 'Y' (0x59)
我不明白 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))
你逃脫%%
但隨后第一次使用字符串作為格式:
"...." % table,
返回一個新字符串,其中%%
轉義百分比由單個%
字符替換。 MySQL數據庫適配器(AB)使用字符串格式化%
了 ,所以它會采取輸出,並希望能夠填補%s
插槽逃脫SQL文本。 正是在那里,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語句,其中%%
轉義符轉換為單個%
字符。
最后,@ Martijn Pieters你完全正確。 謝謝你的有用答案。 另一個錯誤來自SUM和COUNT。 在處理JSON時,Python有時會以瘋狂的方式運行。 所以完整的答案是:
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,))
from sqlalchemy import text sql = "SELECT DATE_FORMAT(snapdate,'%Y-%m-%d') AS date...." db.execute(text(sql))
我發現這個答案更優雅,更不凌亂。 我已經在我的代碼中使用它,沒有任何問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.