19

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))
4

2 に答える 2

40

をエスケープしますが、最初%%に文字列をフォーマッタとして使用します。

"...." % table,

%%エスケープされたパーセンテージが単一の文字に置き換えられた新しい文字列を返します%。MySQL データベース アダプター (ab) は% too%sで文字列の書式設定を使用するため、その出力を取得し、エスケープされた SQL リテラルでスロットを埋めることができると想定します。SQL ステートメントの一部が'%Y-%m-%d'文字列形式として再び解釈され、エラーがスローされます。

解決策は、倍増を 2 倍にすることです。

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スロットを使用してパラメータを入力し、エスケープを 1文字に変換blockidした SQL 文を返します。%%%

于 2013-05-13T21:06:41.943 に答える