PythonからOracleへ接続してみる

⊥∀KA です。

わたしはOracleもPythonも好きですが、よくよく考えてみたらPythonからOracleのデータを参照した経験がなかったです。
今更ながら、勉強もかねてデータを参照してみたいと思います。

今回の評価環境です。

環境
マシンIPアドレスOSPythonOracle
Python 稼働環境 192.168.1.103 Windows 2012R2 Anaconda 4.4
※Python 3.6
-
Oracle 稼働環境 192.168.1.201 Windows 2012R2
-
12.1.0.2

cx_Oracleをインストールします。
cx_OracleはOracle接続用のPythonモジュールです。まずはこのモジュールをインストールします。
インストールにはコマンドプロンプトからpipコマンドを使用します。

C:\> pip install cx_oracle

Collecting cx_oracle
Downloading cx_Oracle-6.1-cp36-cp36m-win_amd64.whl (157kB)
100% | | 163kB 2.2MB/s
Installing collected packages: cx-oracle
Successfully installed cx-oracle-6.1

jupyter notebook上から、cx_Oracleライブラリをインポートし簡易動作確認してみます。

In[1]:import cx_Oracle
In[2]:cx_Oracle.clientversion()
---------------------------------------------------------------------------
DatabaseError Traceback (most recent call last)
in ()
----> 1 cx_Oracle.clientversion()
DatabaseError: DPI-1047: 64-bit Oracle Client library cannot be loaded: "The specified module could not be found".
See https://oracle.github.io/odpi/doc/installation.html#windows for help

早速エラーになりました。Oracle Clientのライブラリがないと言っているようです。
Oracle Instant Clientをインストールしてみます。
こちらからダウンロード可能です。

http://www.oracle.com/technetwork/jp/topics/winx64soft-099056-ja.html

 [ダウンロードファイル]
 instantclient-basic-windows.x64-12.1.0.2.0.zip

ダウンロードしたらzipファイルを展開し、展開したディレクトリパスをPATH環境変数に追加します。
再度、jupyter notebookを起動し、動作確認してみます。

In[1]:import cx_Oracle

In[2]:cx_Oracle.clientversion()
Out[2]:(12, 1, 0, 2, 0)

うまく動作したようです。

ではOracleへ接続してみます。Oracle側で事前に以下を準備しておいてください。

・データベースの作成。今回はORCLデータベースとします。
・リスナーの起動。ポートは1521とします。
・接続用ユーザの作成。今回はTESTUSERユーザを作成しました。
・データの準備。今回は機械学習で有名なIrisのCSVデータを登録しています。テーブル名はIRISとします。

[テーブル定義文]
create table IRIS (
SepalLength number(5,1),
SepalWidth number(5,1),
PetalLength number(5,1),
PetalWidth number(5,1),
Name varchar2(20));

Irisのデータはgitからダウンロードできます。あとはSQL*LOADERなどでインポートしてください。

In[3]:cconnect=x_Oracle.connect(user='testuser', password='oracle', dsn='192.168.1.103:1521/ORCL')

エラーが出ないのでうまく接続できたようです。

もしパスワードが間違っている場合、以下のようなエラーになります。

DatabaseError Traceback (most recent call last)
in ()
----> 1 cx_Oracle.connect(user='testuser', password='oracl', dsn='192.168.1.103:1521/ORCL')

DatabaseError: ORA-01017: ?????/????????????????????????

おやっ、文字化けてますね。こういう場合は、以下を追加すると良いです。

import os
os.environ["NLS_LANG"] = "JAPANESE_JAPAN.JA16SJISTILDE"

では、最後にデータを抽出してDataFrame化してみます。

In[4]:import pandas as pd
import cx_Oracle
import os
os.environ["NLS_LANG"] = "JAPANESE_JAPAN.JA16SJISTILDE"
query = 'select * from IRIS'
connect=cx_Oracle.connect(user='testuser', password='oracle', dsn='192.168.1.103:1521/ORCL')
curs = connect.cursor()
curs.execute(query)
headers = [ x[0] for x in curs.description]

data = curs.fetchall()
df = pd.DataFrame( data, columns=headers)
print(df.head(5))

Out[4]: SEPALLENGTH SEPALWIDTH PETALLENGTH PETALWIDTH NAME
0 5.1 3.5 1.4 0.2 Iris-setosa
1 4.9 3.0 1.4 0.2 Iris-setosa
2 4.7 3.2 1.3 0.2 Iris-setosa
3 4.6 3.1 1.5 0.2 Iris-setosa
4 5.0 3.6 1.4 0.2 Iris-setosa

どうでしょうか?あっさりDataFrame化できました。これで簡単にOracleのデータも機械学習できますね。

Standby Expressに関するお問合わせ

  • TEL 042-333-6217
  • FAX 042-352-6101
  • LINE
  • Mail