2009/03/02(月)pythonのお勉強 (DBアクセス編)

(03/03追記は「続きを読む」の後)

相変わらずpython。
MySQLとOracleに接続する必要がある。
まあ、このあたりがとても参考になる。
Cafe de Paison: MySQLdb
Cafe de Paison: cx_Oracle

ところで、MySQLdbにはDictCursorという便利なものがあります。
しかしこれ、undocumentedなの?
みなさん普通に使っているみたいですが。
そもそもMySQLdb本家を見に行ってもドキュメントが空に見えるんですが...
help('MySQLdb')でオンラインドキュメントは出てきましたが、DictCursorについては書いてない様子。


一方、cx_Oracleにはそういうなのはないらしい。
MLでも「MySQLdbのDictCursor見たいなのはないの?」「自分で作ればいいと思うよ!*1的なやり取りがあるようですが。

pythonはDBの抽象化レイヤがない代わりにDatabase API 2.0に準拠して作られているから大抵大丈夫だよ!という話を聞いていたのですが、パラメータのバインド方法に始まりDBごとに微妙に違う部分があって戸惑ってます。
Perlでもある程度は違うんだけどね。

↓03/03追記↓
cursor.rowcountでやられた。

MySQLdbでは以下のような動作をする
cursor.execute("select * from ~~~ where ~~~")
print cursor.rowcount → selectで引っかかった行数
cx_Oracleでは一度fetchしないと行数がわからない
cursor.execute("select * from ~~~ where ~~~")
print cursor.rowcount → 常に0
cursor.fetchall()
print cursor.rowcount → selectで引っかかった行数
んん~!
[7] rowcount 属性の値は,動的に更新されるようにコーディングしても
かまいません.これは,意味のある rowcount 値を最初に
.fetchXXX() メソッドを呼び出した直後にしか返さないようなデータ
ベースで有用です.
Python Database API Specification v2.0
仕様上は正しいぞ。
Cursor.rowcount
This read-only attribute specifies the number of rows that have currently been fetched from the cursor (for select statements) or that have been affected by the operation (for insert, update and delete statements).
cx_Oracle v5.0.1 documentation
確かにそう書いてあるぞ。

*1 : どちらも意訳