Jupyter NotebookでOracleデータベースに接続する

投稿日: 2018年05月11月

概要

Jupyter NotebookでOracleデータベースに接続してデータ分析できる環境を整えた。

環境

  • CentOS 6.9 64ビット版(諸事情により古い)
  • anyenv経由でpyenvが入ってる

Pythonのインストール

pyenvを使って現時点(2018.5.11)の最新版である3.6.5をインストールした。インストール前にsqliteとbzip2のライブラリを入れておく。

# pyenv install -l
# yum install sqlite-devel bzip2-devel
# pyenv install 3.6.5
# pyenv local 3.6.5

python -v とかしてバージョンを確認する。

sqlite-develを入れ忘れるとjupyter notebook起動時にエラーが出るので注意。その場合sqlite-develを入れて、pyenv installを再度実行しコンパイルし直す必要あり。

Jupyter Notebookのインストール

http://jupyter.readthedocs.io/en/latest/install.html

公式ドキュメント通り、pip自身をアップグレードしてからインストールした。

# pip3 install --upgrade pip
# pip3 install jupyter

下記コマンドでJupyter Notebookが起動することを確認する。(本当はrootで実行するのは良くない)

# jupyter notebook --allow-root

Oracle接続のための設定

PythonのOracle接続モジュールであるcx_Oracleを使う。

cx_OracleはOracle社が提供するOracle Instant Client(Oracle接続用ライブラリ等)が必要となるので事前にインストールと設定が必要。

cx_Oracle及びOracle Instant Clientのインストール方法はcx_Oracleの公式インストールドキュメントに書いてある。

http://cx-oracle.readthedocs.io/en/latest/installation.html

Oracle Instant Clientのインストールと設定

Oracle Technology Network(OTN)から適切なOracle Instant Clientをダウンロードする。今回は下記からダウンロードした。ダウンロードにはOTNのアカウントが必要。

http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html

必要なのは下記ファイル。バージョンは常に最新のものを使えばいいと思う。

instantclient-basic-linux.x64-12.2.0.1.0.zip

インストールはダウンロードしたファイルを解凍するだけで完了。

# mkdir -p /opt/oracle
# cd /opt/oracle
# unzip instantclient-basic-linux.x64-12.2.0.1.0.zip

OSに対して上記ディレクトリからライブラリが読み込まれるように設定する。

sudo sh -c "echo /opt/oracle/instantclient_12_2 > /etc/ld.so.conf.d/oracle-instantclient.conf"
sudo ldconfig

cx_Oracleのインストール

# pip3 install cx_Oracle

Jupyter Notebook上で下記Pythonスクリプトが実行できるか確認する。

import cx_Oracle
cx_Oracle.clientversion()

ここまでで、とりあえずJupyter NotebookでOracleデータベースに接続することができるようになった。

その他の設定

分析用にpandasモジュールをインストールする。

# pip3 install pandas

Jupyter Notebookに他の端末からアクセスできるようにする。一時的にやりたいならこれでいけるらしい。

# jupyter notebook --ip=* --no-browser  --allow-root

恒久的にやるなら設定ファイルを作成する。

# jupyter notebook --generate-config

設定ファイルの下記を書き換え。

c.NotebookApp.ip = '0.0.0.0'

実際にデータを取得してみる

pandasのデータフレームにcx_Oracle経由でデータを取得して表示する。

import cx_Oracle
import os
import pandas as pd
import pandas.io.sql as psql

# 文字化け対策
os.environ["NLS_LANG"] = "JAPANESE_JAPAN.JA16SJISTILDE"

user = 'データベースのユーザ名'
password = 'データベースのパスワード'
# DSNはtnsnames.oraの書式と一緒
dsn = '''
<data source alias> =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = <hostname or IP>)(PORT = <port>))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = <database service name>)
    )
  )
'''


conn = cx_Oracle.connect(user=user, password=password, dsn = dsn)
sql = '''
ここにSELECT文を書く
'''

df = psql.read_sql(sql, conn)

pd.get_option("display.max_rows")
pd.set_option('display.max_rows', 1000)

df

名前:宮内 はじめ

Code for Nagoya名誉代表

E2D3名古屋支部長

プログラマーです。GISやデータビズが好きです。このサイトは宮内の個人的なメモです。

プロフィール

お問い合わせ