cx_Oracleを使ってOracleに接続するサンプル

なんだか最近はてなダイアリーが重くないですか。あれ、私だけですか。とか思っているbonlifeです。
今日はPythonスクリプトからOracleに接続する方法を調べて、試してみました。以下のコードは、CNTRってテーブルに接続して、CTR_CD(センターコード)、CNTR_AB(センター略称)を取得する簡単なスクリプトです。スクリプトの引数にCTR_CDを指定すると、それに対応した内容を検索します。このご時世に手続き型なスクリプトになってしまってゴメンナサイ。

[参考URL]

Windows上で拡張子 .py が python.exe に関連付けられているという前提で書きましたので、場合によっては引数を扱う部分に修正が必要かもしれません。ご注意あれ。

  • cntr_search.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys
import os
import cx_Oracle

# 使い方説明用の関数 usage()

def usage():
    sys.stderr.write("usage : %s CTR_CD [CTR_CD]...\n        ( you can use '*' as a wildcard in CTR_CD)" % os.path.basename(sys.argv[0]))

# 引数チェック (引数が指定されていない場合、エラー終了)

if len(sys.argv) < 2:
    usage()
    sys.exit(2)

# 引数で指定されたコードを大文字に変換後、シングルクォートで括る
# cntr_listに格納

cntr_list = []
for s in sys.argv[1:]:
    cntr_list.append("'%s'" % s.upper().replace("'",""))

# 引数で指定された値から検索条件を生成
# アスタリスクがあった場合、% に置換し、like で検索させる

sql_cond_list = []
for s in cntr_list:
    if s.find('*') != -1:
        sql_condition = 'CTR_CD like ' + s.replace('*','%')
        sql_cond_list.append(sql_condition)
    else:
        sql_condition = 'CTR_CD = ' + s
        sql_cond_list.append(sql_condition)

# Oracleインスタンスに接続し、カーソルを準備

con = cx_Oracle.connect('user/pass@dsn')
cur = con.cursor()

# SQL実行

s = 'SELECT CTR_CD, CNTR_AB FROM CNTR WHERE ' + ' OR '.join(sql_cond_list)
cur.execute(s)

# 表示処理 (カーソルをイテレートして、1行分ずつ取得)
# Noneが返ることがあるため、strで文字列にしておく

for row in cur:
    print str(row[0]) + '\t' + str(row[1])

cur.close()
con.close()

カーソルをイテレータとして処理して1行分ずつ取得している部分は、arraysizeを指定した上でfetchmany()を使って、適当な行数をまとめて取得した方が効率的かもしれないです。(返ってくる行数がほぼ分かっているような場合には、fetchall()でも問題ないですね、きっと。)
こんな感じで細々とPython勉強してみます。