Symfoware

Symfowareについての考察blog

Debian FirebirdにPythonで接続する(kinterbasdb)

PerlからDebianのFirebirdに接続できたので、今度はPythonから接続してみます。



モジュールのインストール



kinterbasdbというモジュールをインストールします。
easy_installでインストールできないようなので、手動でインストールを実施しています。


# cd /usr/local/src
# wget http://sourceforge.net/projects/kinterbasdb/files/kinterbasdb/kinterbasdb-3.2/kinterbasdb-3.2.src.tar.gz/download
# tar zxvf kinterbasdb-3.2.src.tar.gz
# cd kinterbasdb-3.2
# python setup.py install






サンプル



サンプルはこんな感じ。


#!/usr/bin/env python
# -*- coding: utf-8 -*-
import kinterbasdb

con = kinterbasdb.connect(
    dsn="localhost:/var/firebird/post.fdb",
    user="SYSDBA",
    password="masterkey",
    charset="UNICODE_FSS")
    
# カーソル作成
cur = con.cursor()
# SQL実行
cur.execute("SELECT ZIP_CODE,ADDRESS FROM POST WHERE ZIP_CODE = '1000000'")

# 結果取得
row = cur.fetchone()
while row != None:
    print row[0].strip(), row[1].strip()
    row = cur.fetchone()
    
# カーソルを閉じる
cur.close()
# データベースの接続終了
con.close()




これを実行すると、以下のエラーが発生します。


Traceback (most recent call last):
File "test.py", line 10, in <module>
    charset="UNICODE_FSS")
File "/usr/lib/python2.5/site-packages/kinterbasdb/__init__.py", line 435, in connect
    return Connection(*args, **keywords_args)
File "/usr/lib/python2.5/site-packages/kinterbasdb/__init__.py", line 533, in __init__
    _ensureInitialized()
File "/usr/lib/python2.5/site-packages/kinterbasdb/__init__.py", line 348, in _ensureInitialized
    init()
File "/usr/lib/python2.5/site-packages/kinterbasdb/__init__.py", line 295, in init
    globalz, locals(), (chosenTypeConvModuleName,)
File "/usr/lib/python2.5/site-packages/kinterbasdb/typeconv_backcompat.py", line 20, in <module>
    from kinterbasdb import typeconv_datetime_mx
File "/usr/lib/python2.5/site-packages/kinterbasdb/typeconv_datetime_mx.py", line 35, in <module>
    raise ImportError('kinterbasdb uses the mx.DateTime module (from the'
ImportError: kinterbasdb uses the mx.DateTime module (from the "eGenix mx Base Package") by default for date/time/timestamp representation, but you do not have this package installed.
You can either download the eGenix mx Base Package from
http://www.egenix.com/files/python/eGenix-mx-Extensions.html#Download-mxBASE
or tell kinterbasdb to use the Python standard library datetime module instead, as explained at
http://kinterbasdb.sourceforge.net/dist_docs/usage.html#faq_fep_is_mxdatetime_required




eGenix mx Base Packageに依存しているので、インストールしてね。
ということかと思い、調べてみると、
http://kinterbasdb.sourceforge.net/dist_docs/usage.html#faq_fep_is_mxdatetime_required

依存してないよ。オプションを指定してね。
ということらしいです。

いわれたとおり、kinterbasdb.init(type_conv=200)を指定したソースがこちら。


#!/usr/bin/env python
# -*- coding: utf-8 -*-
import kinterbasdb
kinterbasdb.init(type_conv=200)

con = kinterbasdb.connect(
    dsn="localhost:/var/firebird/post.fdb",
    user="SYSDBA",
    password="masterkey",
    charset="UNICODE_FSS")
    
# カーソル作成
cur = con.cursor()
# SQL実行
cur.execute("SELECT ZIP_CODE,ADDRESS FROM POST WHERE ZIP_CODE = '1000000'")

# 結果取得
row = cur.fetchone()
while row != None:
    print row[0].strip(), row[1].strip()
    row = cur.fetchone()
    
# カーソルを閉じる
cur.close()
# データベースの接続終了
con.close()




これでエラーは発生しなくなったのですが、がっつり文字化けします。

うーん。Perlのプログラムやisql-fbの結果は文字化けしないので、
Pythonのプログラムの書き方に原因があるんだと思うのですが・・・

もうちょっと調べてみます。

関連記事

テーマ:データベース - ジャンル:コンピュータ

  1. 2010/01/06(水) 12:15:27|
  2. Firebird
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Debian PerlからOralceに接続する(DBD::Oracle使用) | ホーム | Firebird データベースのパックアップ・リストアとファイルの圧縮(gbak)>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/270-0aaff28d
この記事にトラックバックする(FC2ブログユーザー)