2011-09-08
cx_Oracle で python から Oracle に接続する
SQL*Plus があまりにも使いにくいので、cx_Oracle を使って python から、別のサーバにある Oracle DB へ接続する環境を整えたのでその時のメモ。最初は Cygwin 環境に作ろうとしたが何故かうまくいかず、結局 VMWare を入れて環境を作ることにした。
使用環境は VMWare Player + Ubuntu 10.04 Desktop と Python 3.1, Oracle XE 10g
def __mopemope__(self, *args, **kwargs):とプログラマの実態を大いに参考にさせて頂いた。感謝。
まず OracleXE をインストールする。インストールがうまくいけば、アプリケーションのメニューに Oracle Database 10g Express Edition のメニューが追加されているはずだ。「SQL コマンドラインの実行」をクリックすると SQL*Plus が起動するので、DB サーバに接続出来るか確認しておく。
つぎに cx_Oralce のインストール。linux 向けの cx_Oracle のバイナリは .rpm でしか提供されていないようで、alien コマンドを使い .deb ファイルへの変換を試みたのだが、
hal@ubuntu-vm:~/dist$ sudo alien cx_Oracle-5.1-10g-py26-1.i386.rpm [sudo] password for hal: error: incorrect format: unknown tag
というエラーが出てしまったので、ソースからビルドすることにした。
cx_Oracleから、現時点で最新版の 5.1 のソースをダウンロードする
$ export ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server $ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib $ tar xvfz cx_Oracle-5.1.tar.gz $ cd cx_Oracle-5.1 $ python setup.py build $ sudo env ORACLE_HOME=$ORACLE_HOME python setup.py install
setup.py が、Oracle のバージョンまでチェックしてくれる。
インストールがうまくいけば、site-packages の下に cx_Oracle.so が出来てるはず:
hal@ubuntu-vm:/usr/lib/python3.1/site-packages$ ls -ltr 合計 276 -rwxr-xr-x 1 root root 273240 2011-03-20 08:29 cx_Oracle.so -rw-r--r-- 1 root root 896 2011-03-20 08:29 cx_Oracle-5.1-py3.1.egg-info
尚、ビルドにあたり、 G.Akahane さんの「プログラマの実態」にあったパッチは必要無かった。(cx_Oracle のバージョンが違うためだと思われる)
cx_Oracle を使ったサンプル:
import sys
import cx_Oracle
def show(cur):
while 1:
line = cur.fetchone()
if line is None:
break
print( line )
#
connection = cx_Oracle.connect("user/pass@hostname:port/sid")
cur = connection.cursor()
needCommit = False
for query in sys.stdin:
print( query )
cur.execute(query)
if query.upper().startswith("SELECT"):
show(cur)
else:
needCommit = True
if needCommit:
connection.commit()
cur.close()
connection.close()
標準入力からクエリを受け付けるので、シェルプロと組み合わせることで、かなり仕事が楽になる。はずだ。
これでとりあえず動く環境は出来たが、DB に入っている日本語のデータが文字化けしてうまく出ない。
この問題は時間があれば調べてみる予定。

