PythonでKInterbasDBを使ってFirebirdデータベースに接続してみる
KInterbasDBのダウンロード / インストール
Windowsは7と8で両方とも64bitです。Pythonバージョンは2.7なのでkinterbasdb-3.3.0.win-amd64-py2.7.msiをダウンロードしてインストール。
Linuxはkinterbasdb-3.3.0.tar.bz2をインストールしました。
tar xzvf kinterbasdb-3.3.0.tar.bz2 cd kinterbasdb-3.3.0 python setup.py install
接続テスト
古いLinux機を使っているため文字コードがEUC-JPです。
また、使用しているfirebirdは1.5です。
pythonのバージョンは2.4です。
Windows 7と8.1の64bitでも、同じような方法で接続できました。
Python2.7でfirebird 2.1です。
# -*- coding: euc-jp -*- import site import kinterbasdb def test_conn(): con = kinterbasdb.connect(dsn='127.0.0.1:/var/gdb/test.gdb', user='sysdba', password='masterkey') cur = con.cursor() cur.execute('SELECT FIRST 20 ID, TITLE FROM TEST_TBL ORDER BY ID DESC') rows = cur.fetchall() for (id, title) in rows: print '%d\t%s' % (id, unicode(title, 'euc-jp')) # Windowsなどでは以下の # print '%d\t%s' % (id, unicode(title)) # で動くと思う cur.close() con.close() if __name__ == '__main__': test_conn()
14行目の出力の部分は、データベースに格納されているデータの文字コードとの関係があると思います。私の環境ではunicode(titie)ではエラーが出てしまったので、'euc-jp'を渡していますが、Windows環境でデータの文字コードをUNICODE_FSSに指定した環境ではunicode(title)だけで正常に出力してくれました。
レコードをフィールド名と値のディクショナリで取得する
ディクショナリで取得するにはfetchallmap()など、fetch*メソッドにmapをつけるとディクショナリで取得できるようです。実際にやってみました。
# -*- coding: euc-jp -*- import site import kinterbasdb def test_conn(): con = kinterbasdb.connect(dsn='127.0.0.1:/var/gdb/test.gdb', user='sysdba', password='masterkey') cur = con.cursor() cur.execute('SELECT FIRST 20 ID, TITLE FROM TEST_TBL ORDER BY ID DESC') rows = cur.fetchallmap() for fields in rows: print '%d\t%s' % (fields["id"], unicode(fields["title"], 'euc-jp')) # Windowsなどでは以下の # print '%d\t%s' % (id, unicode(title)) # で動くと思う cur.close() con.close() if __name__ == '__main__': test_conn()
| 固定リンク
| コメント (0)
| トラックバック (0)