なんとな~くしあわせ?の日記

「そしてそれゆえ、知識そのものが力である」 (Nam et ipsa scientia potestas est.) 〜 フランシス・ベーコン

PythonにおけるDBドライバごとのプレースホルダの違いなど

最近少しPythonなどに触れている。そこでぶつかった話

psycopg2

Postgresql用のPythonのDB用ドライバ実装、psycopg2を使うと以下のような見た目のコードになる
Basic module usage — Psycopg 2.6 documentation

>>> cur.execute(
...     """INSERT INTO some_table (an_int, a_date, a_string)
...         VALUES (%s, %s, %s);""",
...     (10, datetime.date(2005, 11, 18), "O'Reilly"))

・cur(カーソル)はJavaとかC++でいうところのstatementとかpreparedstatementにあたるやつ
・注目はVALUES (%s, %s, %s)、なんとフォーマット記述子である

sqlite3

一方Python標準のSQLite3のドライバ実装はどうか
11.13. sqlite3 — SQLite データベースに対する DB-API 2.0 インタフェース — Python 2.7ja1 documentation

import sqlite3

con = sqlite3.connect("mydb")

cur = con.cursor()

who = "Yeltsin"
age = 72

cur.execute("select name_last, age from people where name_last=? and age=?", (who, age))
print cur.fetchone()

・注目はwhere name_last=? and age=?Java使いには馴染みのある記法だ
・これをqmarkと言うらしい

sqlite3 モジュールは2種類の場所確保記法をサポートします。一つは疑問符(qmark スタイル)、もう一つは名前(named スタイル)です

2つをドライバ実装に依存させたくない場合

以下のサイトにあるように、ORMというやつを使うのがいいらしい
紹介マニアどらふと版: Python の ORM いろいろ

結局はSQLAlchemyというのが一番高性能とかpypi.python.org

場当たり的対応

qmarkpgというのが使えます。これでqmarkスタイル、フォーマット記述子いずれでも動きます。カンタン!github.com