Symfoware

Symfowareについての考察blog

DB2 10.5 Express-CにUbuntu + Pythonから接続する(ibm_db使用)

DB2 10.5 Express-Cをインストールしてみました。
CentOS 6.5にDB2 10.5 Express-Cをインストールする

このデータベースにUbuntu 12.04から接続してみます。
地味に苦労しました。



IBM Data Server Driver Package



まずは接続のドライバが必要です。
IBM Data Server Driver Package (DS Driver)をダウンロードします。


こちらのURLを開きます。
http://www-01.ibm.com/support/docview.wss?uid=swg21385217

「IBM Data Server Driver Package (DS Driver)」のリンクをクリック。

371_01.png


IBM IDの入力を求められます。

371_02.png


ダウンロードの選択肢が表示されます。
今回、Ubuntu 12.04 64bitにインストールしたいので、
「IBM Data Server Driver Package (Linux AMD64 and Intel EM64T) Version 10.5 」
を選択しました。

選択したら、画面下の「Continue」をクリック。

371_03.png


使用許諾が表示されます。
「I agree」にチェックをつけて、「I confirm」をクリック。

371_04.png


「IBM Data Server Driver Package (Linux AMD 64)
ibm_data_server_driver_package_linuxx64_v10.5.tar.gz (67 MB)」
をダウンロードしました。

371_05.png




「ibm_data_server_driver_package_linuxx64_v10.5.tar.gz」というファイルが
ダウンロードできたので、これを適当なフォルダに解凍します。

解凍したフォルダに「installDSDriver」というそれっぽいファイルがあるので実行します。


$ ./installDSDriver
bash: ./installDSDriver: /bin/ksh: 誤ったインタプリタです: そのようなファイルやディレクトリはありません




kshを要求しているようです。
一応、bashで実行できないか試してみたところ、


$ bash installDSDriver



これで実行出来ました。
やってる内容は、圧縮ファイルの解凍のようです。


※この手順は不要かもしれません。
installDSDriverを実行したら、libディレクトリが作成されます。
内容を/usr/local/libにコピーし、ライブラリをロードしなおしました。


$ sudo cp -R ./lib/* /usr/local/lib/
$ sudo ldconfig






ibm_dbのインストール



Pythonからの接続は、ibm_dbを使用します。
まず、rootユーザーになります。


$ sudo -s




環境変数「IBM_DB_HOME」に、「ibm_data_server_driver_package_linuxx64_v10.5.tar.gz」を
解凍して、installDSDriverを実行したディレクトリを指定。

easy_installで、ibm_dbをインストールします。


# export IBM_DB_HOME=/home/baranche/DownloadDirector/dsdriver
# easy_install ibm_db



これでとりあえず私の環境ではインストール出来ました。
import ibm_dbが通ればインストール成功です。


$ python
Python 2.7.3 (default, Feb 27 2014, 19:58:35)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import ibm_db
>>>





ちなみに、通常ユーザーでIBM_DB_HOMEを指定してインストールを行うと
こんなエラーになりました。


$ sudo easy_install ibm_db
[sudo] password for baranche:
Searching for ibm-db
Reading http://pypi.python.org/simple/ibm_db/
Reading http://code.google.com/p/ibm-db/downloads/list
Best match: ibm-db 2.0.5
Downloading https://pypi.python.org/packages/source/i/ibm_db/ibm_db-2.0.5.tar.gz#md5=73ed86f4cf423fc608db95403ba988e4
Processing ibm_db-2.0.5.tar.gz
Running ibm_db-2.0.5/setup.py -q bdist_egg --dist-dir /tmp/easy_install-wPdP8K/ibm_db-2.0.5/egg-dist-tmp-BTq5SD
Detected 64-bit Python
Environment variable IBM_DB_HOME is not set.
Set it to your DB2/IBM_Data_Server_Driver installation directory and retry ibm_db module install.
No eggs found in /tmp/easy_install-wPdP8K/ibm_db-2.0.5/egg-dist-tmp-BTq5SD (setup script problem?)







簡単な使い方



「ibm_db」と「ibm_db_dbi」の2つの接続方法があるようです。

漠然とした理解は
「ibm_db」が、CのDB2接続ライブラリをラップしたもの。
「ibm_db_dbi」は「ibm_db」を更にラップし、Python DBIの規約に合わせたもの。
という感じです。


接続テスト用に、こんなテーブルを作っておきました。


CREATE TABLE py_test (id integer, name varchar(100))




データの登録、検索を行うサンプルはこんな感じになりました。


  1. # -*- coding:utf-8 -*-
  2. import ibm_db
  3. import ibm_db_dbi
  4. # 接続文字列を指定して、データベース接続
  5. # 例1
  6. #con = ibm_db_dbi.connect(
  7. #    "DATABASE=sample;HOSTNAME=192.168.1.103;PORT=50000;
  8. #     PROTOCOL=TCPIP;UID=db2inst1;PWD=P@ssw0rd;","","")
  9. # 例2
  10. #con = ibm_db_dbi.connect(
  11. #    "DATABASE=sample;HOSTNAME=192.168.1.103;
  12. #     UID=db2inst1;PWD=P@ssw0rd;","","")
  13. # 例3
  14. # 最後の引数2つは、ユーザー、パスワード
  15. con = ibm_db_dbi.connect("DATABASE=sample;HOSTNAME=192.168.1.103;","db2inst1","P@ssw0rd")
  16. # カーソル取得
  17. cur = con.cursor()
  18. # データ登録テスト
  19. cur.execute(u"INSERT INTO py_test (id, name) VALUES (1, '登録テスト')")
  20. # 登録したデータを検索
  21. cur.execute(u"SELECT * FROM py_test")
  22. for row in cur:
  23.     print("%d, %s" % (row[0], row[1]))
  24. # commitでデータ確定しないと自動ロールバック
  25. con.commit()





日本語を含むクエリは、unicodeオブジェクトにしないと
こんなエラーになりました。


ibm_db_dbi.Error: ibm_db_dbi::Error: Error occure during processing of statement




実行結果はそっけないですが、ちゃんとデータの登録、検索が行えました。


$ python sample.py
1, 登録テスト







プレースフォルダを使用した登録、検索



ibm_db_dbiを使用すれば、一般的なPython DBIと同じ方法で
プレースフォルダを使用した登録、検索が行えました。


  1. # -*- coding:utf-8 -*-
  2. import ibm_db_dbi
  3. con = ibm_db_dbi.connect("DATABASE=sample;HOSTNAME=192.168.1.103;","db2inst1","P@ssw0rd")
  4. # カーソル取得
  5. cur = con.cursor()
  6. # データ登録テスト
  7. cur.execute(u"INSERT INTO py_test (id, name) VALUES (?, ?)", (2, u"プレースフォルダテスト"))
  8. # 登録したデータを検索
  9. cur.execute(u"SELECT * FROM py_test WHERE id = ?", [2])
  10. for row in cur:
  11.     print("%d, %s" % (row[0], row[1]))




実行結果


$ python sample.py
2, プレースフォルダテスト









列名による値の取得



列名を指定して値を取得したい場合のサンプルです。

最初はちょっと強引な方法。
SELECTを実行した後、cursorのdescriptionに検索結果の列名が入っています。
ここから、列名と列位置の対応表を作って、データを取得してみます。


  1. # -*- coding:utf-8 -*-
  2. import ibm_db
  3. import ibm_db_dbi
  4. con = ibm_db_dbi.connect("DATABASE=sample;HOSTNAME=192.168.1.103;","db2inst1","P@ssw0rd")
  5. # カーソル取得
  6. cur = con.cursor()
  7. # データ登録テスト
  8. cur.execute(u"INSERT INTO py_test (id, name) VALUES (?, ?)", (2, u"プレースフォルダテスト"))
  9. # 登録したデータを検索
  10. cur.execute(u"SELECT * FROM py_test WHERE id = ?", [2])
  11. # cur.descriptionに列名が入っている
  12. # これを退避してみる
  13. column_index = {}
  14. for i, desc in enumerate(cur.description):
  15.     print(desc[0])
  16.     #カラム名と位置の対応表作成
  17.     column_index[desc[0]] = i
  18.     
  19. # 作成した対応表を元に、カラム名 => 列の位置に変換
  20. for row in cur:
  21.     print("%d, %s" % (row[column_index['ID']], row[column_index['NAME']]))




ibm_db.fetch_assocを使用すれば、結果が辞書型で取得できるので、
それを使ってフェッチする方法。


  1. # -*- coding:utf-8 -*-
  2. import ibm_db
  3. import ibm_db_dbi
  4. con = ibm_db_dbi.connect("DATABASE=sample;HOSTNAME=192.168.1.103;","db2inst1","P@ssw0rd")
  5. # カーソル取得
  6. cur = con.cursor()
  7. # データ登録テスト
  8. cur.execute(u"INSERT INTO py_test (id, name) VALUES (?, ?)", (2, u"プレースフォルダテスト"))
  9. # 登録したデータを検索
  10. cur.execute(u"SELECT * FROM py_test WHERE id = ?", [2])
  11. # ibm_db.fetch_assocを使用して、辞書型で取得
  12. row = ibm_db.fetch_assoc(cur.stmt_handler)
  13. while row != False:
  14.     print "%d, %s" % (row["ID"], row["NAME"])
  15.     row = ibm_db.fetch_assoc(cur.stmt_handler)






【参考URL】

https://code.google.com/p/ibm-db/

[データベース・アプリケーションの開発] - [データベース・アプリケーション] - [Python、SQLAlchemy、および Django Framework]
http://pic.dhe.ibm.com/infocenter/db2luw/v10r5/index.jsp
関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2014/03/14(金) 01:15:07|
  2. DB2
  3. | トラックバック:0
  4. | コメント:1
  5. | 編集
<<Ubuntu 12.04 LTSにDB2 10.5 Express-Cをインストールする | ホーム | DB2 10.5のBLOB列にJavaから画像データを登録する>>

コメント

管理人のみ閲覧できます

このコメントは管理人のみ閲覧できます
  1. 2017/06/10(土) 14:28:28 |
  2. |
  3. #
  4. [ 編集 ]

コメントの投稿


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

トラックバック

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