Python

PyMySQLでプレースホルダのパーセントをエスケープする

Python で PyMySQL を使ってデータベースに接続していたのですが、以下のクエリを通すのに少し悩みました。

DATE_FORMAT(hoge, ‘%Y-%m-%d’)

通常、プレースホルダでパラメータを埋め込む場合は %s を使いますが、このパーセントの文字に反応して %Y がエラーとなります。

今回は、上記のようにパーセントをプレースホルダとして使われない対策を紹介します。

エスケープ方法

この手のエスケープですぐに思いつくのが、下記の 2 つです。

・バックスラッシュ(エンマーク)
・パーセントの重ね合わせ

結果的には後者の「パーセントの重ね合わせ」だったわけですが、公式ドキュメントでも見つけられないのですよね。

公式ドキュメントで見つけたのはプレースホルダの説明だけで、エスケープについては語られず。

探し方が悪い?

If args is a list or tuple, %s can be used as a placeholder in the query. If args is a dict, %(name)s can be used as a placeholder in the query.

Cursor Objects

サンプル

では、試しに DB に接続して DATE_FORMAT を試してみましょう。
(例外処理は省略します)

サクっと使えるところが PyMySQL の良いところですね。

Python にも少しずつ慣れてきたので、ベストプラクティスやアンチパターンについても勉強していきたいところです。