Pylons + SQLAlchemyの構成でDB2に接続する



PylonsのインストールとPythonからDB2へ接続する環境が
できたので、Pylons+SQLAlchemyからDB2へ接続してみます。


ここを参考に設定をおこないます。
ibm-db Quick Getting Started Steps (README)
http://code.google.com/p/ibm-db/wiki/README


ibm_db_saというモジュールが必用なので、
easy_installでインストールします。


#easy_install ibm_db_sa



次にSQLAlchemyのインストールです。
注意しなくてはいけないのは、ibm_db_saは
0.4.xに準拠しているため、0.5.xを入れていると


>>> import sqlalchemy
>>> from sqlalchemy import *
>>> import ibm_db_sa.ibm_db_sa
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.5/site-packages/ibm_db_sa-0.1.6-py2.5.egg/ibm_db_sa/ibm_db_sa.py", line 24, in <module>
from sqlalchemy import sql, engine, schema, exceptions, logging
ImportError: cannot import name logging


というエラーが発生し、動いてくれませんでした。


既に0.5.xをインストールしている場合は


#easy_install -m SQLAlchemy


としてアンインストールします。


その後、2009/1/6時点で最新の0.4.6をインストールします。


#easy_install SQLAlchemy==0.4.6


念のためバージョンチェック


>>> import sqlalchemy
>>> sqlalchemy.__version__
'0.4.6'


これで準備は整いました。

以前試したSQLiteとの連携を参考にDB2に接続してみます。

Python Pylons モデルの使用(sqlite連携)


development.iniの[app:main]セクションに接続のための記述を追加


[app:main]
sqlalchemy.default.url = ibm_db_sa://db2inst1:password@localhost:50000/test



/config/environment.pyはリンク先と同様の記述を行いました。


/model/__init__.pyはこんな感じです。


from pylons import config
from sqlalchemy import Column, MetaData, Table, types
from sqlalchemy.orm import mapper
from sqlalchemy.orm import scoped_session, sessionmaker

#セッション生成
#Session = scoped_session(sessionmaker(autoflush=True, autocommit=True, bind=config['pylons.g'].sa_engine))
#SQLAlchemy0.4ではautocommitではなく、transactionalを使用
Session = scoped_session(sessionmaker(autoflush=True, transactional=True, bind=config['pylons.g'].sa_engine))

metadata = MetaData()

#テーブル定義
pages_table = Table('xml_table', metadata,
  Column('id', types.Integer(), primary_key=True),
  Column('lastmodified', types.DateTime(), default=''),
  Column('document', types.String(), default='')
)


#xml_tableテーブルを操作するオブジェクト
class Page(object):
  def __str__(self):
    return self.id

mapper(Page, pages_table)



/lib/base.pyはリンク先と同様の記述を行いました。


コントローラ「page」を作成し


#paster controller page


page.pyはとりあえずデバッグ用として、このような記述を行いました。


import logging

from helloworld.lib.base import *
from helloworld.model import Page

log = logging.getLogger(__name__)

class PageController(BaseController):
  def index(self):
    return Session.query(Page).all()[0].document



これでブラウザに登録されているxmlの内容が表示されるはず。


ODBCドライバのテストと日本語の表示を確認するため、
CSEからこんなクエリを発行しました。


update xml_table set document = '<?xml version="1.0" encoding="UTF-8" ?><doc><data>日本語どうよ?</data></doc>'




#paster serve --reload development.ini


として、テスト用のサーバを起動し

http://localhost:5000/page/
にアクセスすると・・・





長かった・・・





もどる