Oracle CloudにあるAutonomous Data WarehouseにJupyter Notebookから接続してみる

# はじめに

環境が必要になりインストールしたので、備忘録です。
Python仮想環境には、pyenv + pipenv を利用しました。

1. [Oracle Cloud Infrastructure 環境で Jupyter NotebookとTensorFlowをインストール](https://qiita.com/mikika/items/04ffe2acbbbfc4571bc8) 
でセットアップした環境に

2. [Oracle CloudにあるAutonomous Data WarehouseにPythonから接続してみる（cx_Oracleの利用）](https://qiita.com/mikika/items/17e6949b21fcc447ee98)
の手順を追加して、Notebook環境からAutonomous Data Warehouse（ADW）へ接続をしています。

# 環境

上記1. を参照

# インストール①：Jupyter Notebook

## pyenv + pipenv 仮想環境で Jupyter Notebook をインストール

[Oracle Cloud Infrastructure 環境で Jupyter NotebookとTensorFlowをインストール](https://qiita.com/mikika/items/04ffe2acbbbfc4571bc8)

の手順でインストールする。但し後でjupyter notebookを再起動する必要が出てくるので、上記手順のうち「Jupyter Notebookを起動」の直前までを実行する。

# インストール②：PythonからOracleへ接続

Oracle Clientと、cx_Oracleをインストールする。
ここでは、コマンドの実行ログを中心に記載する。

詳しい説明は下記参照。（なお、今回はCentOSだが、このとき ↓↓ はUbuntuにインストールしている）

 [Oracle CloudにあるAutonomous Data WarehouseにPythonから接続してみる（cx_Oracleの利用）](https://qiita.com/mikika/items/17e6949b21fcc447ee98)




## Oracle Instant Client のインストール
今回は、自分の $HOME以下にインストールすることにする。

[OTNダウンロードサイト](https://www.oracle.com/technetwork/database/database-technologies/instant-client/overview/index.html)：Oracle Instant Client　より、
Version 18.5.0.0.0, Base - Basic Package の
instantclient-basic-linux.x64-18.5.0.0.0dbru.zip
をダウンロード。

※ADWのマニュアルでは18.3をインストールしていたので、心配な方は18.3を推奨。

$HOME直下にダウンロードしたファイルを配置し、unzip。

```
$ unzip instantclient-basic-linux.x64-18.5.0.0.0dbru.zip
```

展開後、中身を確認。

```
$ cd instantclient_18_5
$ ls -l
total 227700
-rwxr-xr-x. 1 fn docker     42360 Feb 26 20:04 adrci
-r-xr-xr-x. 1 fn docker      5780 Feb 26 20:04 BASIC_LICENSE
-rw-r--r--. 1 fn docker      1632 Feb 26 20:04 BASIC_README
-rwxr-xr-x. 1 fn docker     66672 Feb 26 20:04 genezi
-rwxrwxr-x. 1 fn docker   8357160 Feb 26 20:04 libclntshcore.so.18.1
lrwxrwxrwx. 1 fn docker        17 Mar 21 16:48 libclntsh.so -> libclntsh.so.18.1　★★★
(略)
```

★★★は、インストール手順によると、無ければシンボリックリンクを作成せよとのことだったが、既に存在していたので特に何もしない。


### LD_LIBRARY_PATHの設定

$HOME/.bash_profile に追加

```:.bash_profile
export LD_LIBRARY_PATH=/home/自分のユーザ名/instantclient_18_5:$LD_LIBRARY_PATH
```


## cx_Oracleのインストール

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

に従って行う。pipenv環境なので、インストールは pipenv install ～ で実行する。

```
$ cd mypj

$ pipenv install cx_Oracle
Installing cx_Oracle...
Adding cx_Oracle to Pipfile's [packages]...
? Installation Succeeded
Pipfile.lock (065acf) out of date, updating to (dbf860)...
Locking [dev-packages] dependencies...
Locking [packages] dependencies...
? Success!
Updated Pipfile.lock (065acf)!
Installing dependencies from Pipfile.lock (065acf)...
   ???????????????????????????????? 121/121 ― 00:01:21
$
```

## libaioのインストール

手順の中ではInstant Clientのインストール欄に書かれていたが、libaioをインストール。...しようとしたが既に入ってた。

```
$ sudo yum install libaio
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
epel/x86_64/metalink                                                                                                             |  17 kB  00:00:00
 * base: mirrors.maine.edu
 * epel: mirror.compevo.com
 * extras: mirror.cs.uwp.edu
 * updates: linux.mirrors.es.net
base                                                                                                                             | 3.6 kB  00:00:00
dockerrepo                                                                                                                       | 2.9 kB  00:00:00
epel                                                                                                                             | 4.7 kB  00:00:00
extras                                                                                                                           | 3.4 kB  00:00:00
updates                                                                                                                          | 3.4 kB  00:00:00
(1/4): epel/x86_64/updateinfo                                                                                                    | 1.0 MB  00:00:00
(2/4): epel/x86_64/primary_db                                                                                                    | 6.6 MB  00:00:00
(3/4): extras/7/x86_64/primary_db                                                                                                | 187 kB  00:00:00
(4/4): updates/7/x86_64/primary_db                                                                                               | 3.3 MB  00:00:00
Package libaio-0.3.109-13.el7.x86_64 already installed and latest version
Nothing to do
$
```

## インストールできたことを確認
Instant Client と cx_Oracleがインストールできたことを確認

- LD_LIBRARY_PATHを有効にするため .bash_profile を読み込む


```
$ . ~/.bash_profile
$ env |grep LD
LD_LIBRARY_PATH=/home/fn/instantclient_18_5: <-- Instant Clientのディレクトリに通っていることを確認
```

- 特定のディレクトリ(ここではmypj)に移動し、pipenv shell で 仮想環境を有効にしてからpython実行する

```
[fn@yuzu ~]$ cd mypj
[fn@yuzu mypj]$ pipenv shell
Launching subshell in virtual environment...
 . /home/fn/.local/share/virtualenvs/mypj-CamC0rlR/bin/activate
[fn@yuzu mypj]$  . /home/fn/.local/share/virtualenvs/mypj-CamC0rlR/bin/activate
(mypj) [fn@yuzu mypj]$ python
Python 3.6.8 (default, Mar 12 2019, 06:34:05)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cx_Oracle
>>> cx_Oracle.clientversion()
(18, 5, 0, 0, 0)
>>> exit()
(mypj) [fn@yuzu mypj]$
```

# ADW環境への接続

冒頭でも参照している 「Oracle CloudにあるAutonomous Data WarehouseにPythonから接続してみる（cx_Oracleの利用）」の[ADW環境への接続](https://qiita.com/mikika/items/17e6949b21fcc447ee98#adw%E7%92%B0%E5%A2%83%E3%81%B8%E3%81%AE%E6%8E%A5%E7%B6%9A) を参照し、以下の情報やファイルを準備する。

- 接続するためのWallet_XXX.zip（クライアント・セキュリティ資格証明のファイル一式 ）★① Wallet_myadw.zip
- 接続に使用する、ネット・サービス名（tnsnames.oraのエントリのこと）★②myadw_high
- 接続するデータベースユーザの名前・パスワード ★③scott/tiger

それぞれの情報は、ここでは★①、★②、★③とする。

## 必要なファイルを network/admin/以下に配置

★①を instantclient_18_5/network/admin/以下で unzip

```
$ mv Wallet_myadw.zip ~/instantclient_18_5/network/admin/
$ cd ~/instantclient_18_5/network/admin/
$ unzip Wallet_myadw.zip
```

## Jupyter Notebookを起動

LD_LIBRARY_PATHを有効にしてから、Notebookを起動する。
（既に起動済みの場合は一旦停止し、下記手順を実行）



```
$ . ~/.bash_profile
$ cd mypj
$ pipenv shell <-- まだpipenv仮想環境に入っていない場合は実行する
$ jupyter-notebook &
[1] 2293
$ [I 12:22:06.152 NotebookApp] Writing notebook server cookie secret to /home/fn/.local/share/jupyter/runtime/notebook_cookie_secret
[I 12:22:06.387 NotebookApp] Serving notebooks from local directory: /home/fn/mypj
[I 12:22:06.387 NotebookApp] The Jupyter Notebook is running at:
[I 12:22:06.387 NotebookApp] http://(yuzu or 127.0.0.1):8888/
[I 12:22:06.387 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
```

## アクセスして新規Notebookを開く

ブラウザから **http://＜Public IP アドレス＞:8888/**
Jupyter Notebook用に指定したパスワードを入力し、Log in.
New -> Python3 で新規Notebookを開く

## ADWに接続しSQLを実行

Notebook内に以下のように入力し、実行する。
cx_Oracle.connect()に、接続情報（上の★②、★③）を指定。

sql=で指定したSQLの実行結果が表示される。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/297987/64665d67-4761-90e5-1796-a44872f08a98.png)

### 入力した内容（コピペ用）

※conn= を環境に合わせて変更する。

```
import cx_Oracle
conn=cx_Oracle.connect(user='scott',password='tiger',dsn='myadw_high')

sql='select table_name, status from user_tables'
print(sql)
cur = conn.cursor()
for row in cur.execute(sql):
    print(row)
```

※LD_LIBRARY_PATHが通ってない場合は、実行時に以下のエラーが出る
DatabaseError: DPI-1047: 64-bit Oracle Client library cannot be loaded: "libclntsh.so: cannot open shared object file: No such file or directory".

# 参考

- [Using Oracle Autonomous Data Warehouse - Connect with Python, Node.js, and other Scripting Languages](https://docs.oracle.com/en/cloud/paas/autonomous-data-warehouse-cloud/user/connecting-nodejs.html#GUID-AB1E323A-65B9-47C4-840B-EC3453F3AD53)
- [Oracle Autonomous Data Warehouseの使用 - Python、Node.js、およびその他のスクリプト言語での接続](
https://docs.oracle.com/cd/E83857_01/paas/autonomous-data-warehouse-cloud/user/connecting-nodejs.html#GUID-AB1E323A-65B9-47C4-840B-EC3453F3AD53)
- [cx_Oracle 7 Installation](https://cx-oracle.readthedocs.io/en/latest/installation.html)