簡體   English   中英

Python => ValueError: 不支持的格式字符 'Y' (0x59)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM