Python sqlite3 で "LIKE ? ESCAPE \" する
プチハマったのでメモ。
結論
keyword = "%E3%81%8A%E3%81%A3%E3%81%B1%E3%81%84" escaped_keyword = keyword.replace("%", "\\%") like_keyword = f"%{escaped_keyword}%" params = (escaped_keyword,) query = "SELECT * FROM foo WHERE bar LIKE ? ESCAPE '\\'" cursor.execute(query, params) rows = cursor.fetchall()
プチ解説
"%" を含む文字列は LIKE ? に渡すときに "%" をエスケープしてあげる必要があります("_" も同様)。
CLI の SQLite であれば "LIKE %\%% ESCAPE \" などして普通にエスケープできるのですが、Python では str に "\" を含む場合は "\" 自体をエスケープする必要があります。
と、プチややこしい感じだったのでメモです。
ちなみに、f-stringの中では "\" は使えないようです。また、"\" は "<" のように適当な記号に変えることも可能です。まあ大抵の文字列に "\" は入ってないので、都合が良い記号ではあると思うのですが。
%E3%81%8A%E3%81%A3%E3%81%B1%E3%81%84!