Windows環境のPythonからOracleに接続してみる

前提はWindows7環境にAnaconda5.2-Python 3.6 versionがインストールしている状態からの手順です。

PythonからOracleに接続するには
cx_Oracle、Oracle Clientをインストールします。


#<b>cx_Oracle要件確認
- http://cx-oracle.readthedocs.io/en/latest/installation.html#overview

>Python 2.7 or 3.4 and higher. Older versions of cx_Oracle may work with 　older versions of Python.
  
Pythonのバージョンは、3.6.4なのでOK!
  
>Oracle client libraries. These can be from the free Oracle Instant    Client,or those included in Oracle Database if Python is on the same machine as the database.Oracle client libraries versions 12.2, 12.1 and 11.2 are supported on Linux, Windows and macOS.Users have also reported success with other platforms.

以前にOracle Client をインストールしているのでOK!

  
>An Oracle Database. Oracle’s standard client-server version interoperability allows cx_Oracle  to connect to both older and newer databases.
  
 これはClientとDatabaseの接続が問題ないかを言っている
      ClientのバージョンとDBのバージョンがサポートされる組み合わせですよねと言う事
      
 My Oracle Suppot
      =====
       クライアント / サーバー 異なるバージョン間の互換性サポート・マトリクス (ドキュメントID 2127402.1)
      =====
      
 自分の環境はOracle Clientが11g 、接続DBは12c、11gなのでOK!


#<b>cx_Oracleのインストール<b>

Anaconda Promptを起動 

![image.png](https://qiita-image-store.s3.amazonaws.com/0/261475/98c41d98-3767-1ee5-dd0e-855417eb539f.png)

Anaconda Promptで
cx_Oracleを 「 python -m pip install cx_Oracle --upgrade 」 でインストール

```
(base) C:\Users> python -m pip install cx_Oracle --upgrade

Collecting cx_Oracle
  Downloading https://files.pythonhosted.org/packages/82/75/58333eae77a58a7243cc
6905c8dfec6ef92ab5d4b6c33d0c70d1b7f3ce3a/cx_Oracle-6.3.1-cp36-cp36m-win_amd64.wh
l (162kB)
    100% |████████████████████████████████| 163kB 168kB/s
notebook 5.4.0 requires ipykernel, which is not installed.
jupyter 1.0.0 requires ipykernel, which is not installed.
jupyter-console 5.2.0 requires ipykernel, which is not installed.
ipywidgets 7.1.1 requires ipykernel>=4.5.1, which is not installed.
Installing collected packages: cx-Oracle
Successfully installed cx-Oracle-6.3.1　
```

「Successfully installed cx-Oracle-6.3.1」　とでたので
ためしに cx_Oracleをインポートしてみる

Anaconda Promptを起動 して import cx_Oracle　を実行

```
(base) C:\Users>python
Python 3.6.4 |Anaconda, Inc.| (default, Jan 16 2018, 10:22:32) [MSC v.1900 64 bi
t (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.

>>> import cx_Oracle
>>> cx_Oracle.clientversion()

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
cx_Oracle.DatabaseError: DPI-1047: 64-bit Oracle Client library cannot be loaded
: "C:\app\product\11.2.0\client_1\bin\oci.dll is not the correct archit
ecture". See https://oracle.github.io/odpi/doc/installation.html#windows for help
```

なにやらエラー!
メッセージをみると 自分のPCにインストールしたPython は64bit 、以前にインストールしたOracle Client は32bit なのでエラーになっていて、対応は64bitのOracle Clientをいれないといけないようだ


#Oracle Instanct Clientをダウンロード
- http://www.oracle.com/technetwork/topics/winx64soft-089540.html
  
ここから　instantclient-basic-windows.x64-11.2.0.4.0.zip をダウンロードして
任意の場所に保存して、unzip する

#Windows環境変数を設定

環境変数 PATHに
Oracle Instanct Clientを解凍したパスを追加する
[コントロールパネル]-[システム]-[システム詳細設定]-[環境変数]で設定


再度、トライ


```
(base) C:\Users>python
Python 3.6.4 |Anaconda, Inc.| (default, Jan 16 2018, 10:22:32) [MSC v.1900 64 bi
t (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.

>>> import cx_Oracle
>>> cx_Oracle.clientversion()

(11, 2, 0, 4, 0)

```




さっき、ダウンロードしたOracle Instance Client のバージョンが表示された！

#Pythonのコードから接続してみる

```python:oraconnect.py
import cx_Oracle

#サーバ名 / IP
HOST = "xxxxxx"
#ポート
PORT = 1521
#SID
SID = "orcl"


tns = cx_Oracle.makedsn(HOST, PORT, SID)
conn = cx_Oracle.connect("scott", "tiger", tns)

cur = conn.cursor()
cur.execute("""SELECT INSTANCE_NAME,HOST_NAME FROM v$instance""")

rows = cur.fetchall()

for r in rows:
    print("%d : %s" % (r[0], r[1]))
```

実行結果

```
orcl:xxxxxx
```
インスタンス名とホスト名が表示された！



上記コードは
Oracle の SID を指定しています。

Oracle RAC　の場合、SERVICE_NAME を指定することが多いので
SERVICE_NAMEの指定方法は以下の投稿を参照ください。

- [PythonからOracle接続をSID指定ではなく、SERVICE_NAME指定で接続する](https://qiita.com/kngsym2018/items/f50499dc235db5dd0736)

#関連リンク
 
Pythonスクリプトの実行方法、バインド変数を使用したSQL、SELECT文のデータ取得方法については
以下を参照ください

・[Windows環境でPythonスクリプト(.py)の実行方法](https://qiita.com/kngsym2018/items/21b6efe4547a78661951)

・[Python Oracleでバインド変数を使ったSQLを実行する](https://qiita.com/kngsym2018/items/e8156b226c9bae97da0b)

・[Python Oracle SQL(select文)データ取得方法(fetchall、fetchmany、fetchone)とチューニングパラメータ]
(https://qiita.com/kngsym2018/items/ac9348b02589e3a93c44)