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