Db2 CLIからWatsonQueryにアクセスする

当記事はDb2のCLI（コマンドラインインターフェース）からIBM Cloudのデータ仮想化サービス[Watson Query(SaaS版)](https://cloud.ibm.com/catalog/services/watson-query)に接続する方法について説明します。
外部のBIツールなどからWatson Queryには、Db2のJDBCドライバーが使用できればでアクセスすることができますので、もちろんDb2 CLIからもアクセスできるのです!その際、useridではなくAPIKEYが必要です。

GUIでなくてCLIでアクセスしたい(昔からのDb2ユーザーの傾向！）、シェルプログラムでバッチ操作したいなどの場合にお使いください。

ここで確認した環境は以下です：　
- Red Hat Enterprise Linux 8
- IBM Data Server Runtime Client v11.5.7


# 1. APIKEY, 接続情報の準備

今回必要なのは以下の4つです。
- APIKEY
- host名(hostname, IP addressなど)
- port番号
- db名



### 1-1.  APIKEYは以下の2つの方法、どちらかで準備してください。
- [IBM Cloud APIKEYの作成(取得)方法](https://qiita.com/nishikyon/items/fa8b951267efbe911fe7)
    - これはIBM CloudのIDに紐ついたAPIKEYで権限はそのIDと同じになります
- [Watson QueryのAPIKEYを含む資格情報の作成と接続情報の取得](https://qiita.com/nishikyon/items/b8bed0d006ae15088780)
    - こちらはWatson Query用のAPIKEYでManagerかDataAccessかが選べます


### 1-2.  接続情報は以下の方法で準備してください。
「[DBeaverからWatsonQueryにアクセスする](https://qiita.com/nishikyon/items/41ec3389b60a071c7c92)」の「[1-2. 接続情報は以下のどちらかで取得してください。](https://qiita.com/nishikyon/items/41ec3389b60a071c7c92#1-2--%E6%8E%A5%E7%B6%9A%E6%83%85%E5%A0%B1%E3%81%AF%E4%BB%A5%E4%B8%8B%E3%81%AE%E3%81%A9%E3%81%A1%E3%82%89%E3%81%8B%E3%81%A7%E5%8F%96%E5%BE%97%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84)」に記載の方法で取得します。

# 2. Watson QueryのDbをカタログする
Watson QueryのDbをリモートDbとして、カタログします。


### 2-1. Nodeのカタログ

以下のコマンドでカタログします:<>で囲まれた部分は1で取得した自分の情報に入れ替えます
```shell-session
db2 catalog tcpip node <任意のNode名> remote <host名> server <port番号> security ssl
```

コマンド実行例:
```shell-session
[db2inst1@host-aaa ~]$db2 catalog tcpip node WQNODE remote 00000000-0000-0000-0000-xxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxx.databases.appdomain.cloud server 34567 security ssl
DB20000I  The CATALOG TCPIP NODE command completed successfully.
DB21056W  Directory changes may not be effective until the directory cache is
refreshed.
[db2inst1@host-aaa ~]$
```
### 2-2. DBのカタログ
以下のコマンドでカタログします:<>で囲まれた部分は1で取得した自分の情報に入れ替えます
```shell_session
db2 catalog db <db名> as <任意のDb別名> at node <2-1で設定した任意のNode名> AUTHENTICATION GSSPLUGIN
```
APIKEYでアクセスするため`AUTHENTICATION GSSPLUGIN`を忘れずに入れます。

コマンド実行例:
```shell-session
[db2inst1@host-aaa ~]$ db2 catalog db bludb as WQDB at node WQNODE AUTHENTICATION GSSPLUGIN
DB20000I  The CATALOG DATABASE command completed successfully.
DB21056W  Directory changes may not be effective until the directory cache is
refreshed.
[db2inst1@host-aaa ~]$
```

最後に以下のコマンドでdirectory cache をリフレッシュします。
```shell-session
db2 terminate
```

コマンド実行例:
```shell-session
[db2inst1@host-aaa ~]$ db2 terminate
DB20000I  The TERMINATE command completed successfully.
[db2inst1@host-aaa ~]$
```

これで設定は完了です！


# 3. Watson QueryのDbに接続
APIKEYを使って、 Watson QueryのDbに接続します。
以下のコマンドでカタログします:<>で囲まれた部分は1で取得した自分の情報に入れ替えます
```shell_session
db2 connect to <2-2で設定した任意のDb別名> APIKEY <1で取得したAPIKEYの値>
```

コマンド実行例:
```shell-session
[db2inst1@host-aaa ~]$ db2 connect to WQDB APIKEY xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

   Database Connection Information

 Database server        = DB2/LINUXX8664 11.5.6.0
 SQL authorization ID   = DV_IAM_S...
 Local database alias   = WQDB

[db2inst1@host-aaa ~]$
```


# 3. Watson QueryのDbでSQLを実行

Db接続後、SQL実行が可能です。
仮想化したテーブル一覧は[SYSCAT.NICKNAMES カタログ・ビュー](https://www.ibm.com/docs/ja/db2/11.5?topic=views-syscatnicknames)に入っているようです。
仮想化したテーブル一覧(スキーマ付き)を取得するSQLサンプル:
```shell-session
db2 "select TABSCHEMA|| '.'||TRIM(TABNAME) as SchemaTableName from SYSCAT.NICKNAMES  where TABSCHEMA <> 'DVSYS'"
```
　
実行例:
```shell-session
[db2inst1@host-aaa ~]$ db2 "select TABSCHEMA|| '.'||TRIM(TABNAME) as SchemaTableName from SYSCAT.NICKNAMES  where TABSCHEMA <> 'DVSYS'"

SCHEMATABLENAME
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
NISHITO .SHAREBIKE_CHIBA

  1 record(s) selected.

[db2inst1@host-aaa ~]$
```

普通に仮想化したテーブルにSELECTできます。以下はSELECTの実行例です:
```shell-session
[db2inst1@host-aaa ~]$ db2 "select ID from NISHITO.SHAREBIKE_CHIBA fetch  first 10 rows only"

ID
--------
00301996
00302005
00302008
00302305
00302308
00302324
00302329
00302334
00302339
00302344

  10 record(s) selected.

[db2inst1@host-aaa ~]$
```

使用が終わったら接続を切ります。
```shell-session
db2 connect reset
```

実行例:
```shell-session
[db2inst1@host-aaa  ~]$ db2 connect reset
DB20000I  The SQL command completed successfully.
[db2inst1@host-aaa  ~]$
```

以上です。