Pylons + SQLAlchemyの構成で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/
にアクセスすると・・・
長かった・・・