DBAPI勉強中

PostgreSQL + psycopg2でデータベースにアクセスちゅう。

PEP 249 -- Python Database API Specification v2.0 | Python.org

いわゆるプリペアードステートメントみたいな、SQLとパラメータを別々に渡すために、DBAPIでは何種類かのフォーマットが選べるみたいです。で、デフォルトは'pyformat'になってるみたいです。

>>> import psycopg2
>>> psycopg2.paramstyle
'pyformat'

pyformatの場合は、execute()の時に値を辞書で渡します。

>>> con = psycopg2.connect("dbname=mail")
>>> cur = con.cursor()
>>> cur.execute("select %(msg)s", dict(msg="Hello"))

とすると、PostgreSQL側では、

LOG:  statement: BEGIN; SET TRANSACTION ISOLATION LEVEL READ COMMITTED
LOG:  statement: select 'Hello'

ってな感じでログが残ります。

  • トランザクションは自動的に開始されるみたいです
  • 文字列のクォートも自動的にやってくれてますね

ためしに意地悪してみると、

>>> cur.execute("select %(msg)s", dict(msg="it's a beautiful day"))
>>> cur.execute("select %(msg)s", dict(msg=None))
LOG:  statement: select 'it''s a beautiful day'
LOG:  statement: select NULL

ちゃんとエスケープしてますね。あとNoneはNULLになるようです。