sqlite3
はパラメーターのバインドの形式としてqmarkとnamedを受け付けてくれますが、PEP2491で定義されているformatとpyformat形式は受け付けてくれません23。これは、それらを受け付けるようにするモジュールです。
Pythonのバージョンは2.7.8と3.4.1でテストを実施してあります。
使い方
pip install sqlite3paramstyle
%s
の箇所にバインドしてくれます。
conn = sqlite3paramstyle.connect(":memory:")
cur = conn.cursor()
cur.execute("select %s, %s", ("foo", "bar"))
cur.fetchall() # [("foo", "bar")]
Python拡張形式のフォーマットにも対応してます。
cur.execute("select %(who)s, %(age)s", {"who": "John", "age": 20})
cur.fetchall() # [("John", 20)]$
どこかの誰かの助けになると嬉しいです
作成した背景
テストコードのほぼないPythonコードのメンテをすることになって粛々とテストを追加していたが、psycopg2
を生で使ってるPythonコードを発見。ぜひともSQLAlchemy
を使っておきたいところだったが、依存モジュールを変更するのがしんどいフェーズだったので、なるべく変更しない方向で進めることに。
CIサーバーでPostgresqlプロセスを常時動かしておくのはいやだったのと、DBコネクションは外部から引き渡せるかたちになっていたので、テスト時はsqlite3
のコネクションを渡して実行するようにしてみた。
が、psycopg2
が受け付けるパラメータースタイルは上記説明にあるformat形式とpyformat形式であり、sqlite3
とまったく互換性がない。
psycopg2
を拡張してqmarkスタイルを受け付けるようにするqmarkpgというのを見つけたので、それの逆に動くモジュールを書けばいいんじゃね?と思った次第。
PyPIオーサーになれて嬉しい ワーイワーイ