Tableau for MacからData Virtualization(Watson Query)にJDBC接続してみた

# 前提

- 環境
    - IBM Cloud Watson Query
    - Tableau for Mac
    - IBM Data Server Driver


# 概要

タイトルのまんまである


# 1. JDBCの接続情報を取得しよう

Data Virtualization(Watson Query)と言っても、接続部分はほとんどDb2なので普通にDb2と接続する感覚でOK
SaaS版のWatson Queryの場合はService credentialを作成すると接続に使うインターフェースごとにどのようなプロパティを指定すればいいか簡単に分かるぞ
ちなみにService credentialで作成されるapikeyはservice-to-serviceでの接続で使うものを意図しているので、user-to-serviceの接続の場合は基本的にはIAM apikeyを使おう

![WatsonQueryServiceCredential.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2084334/3a5b53f2-f41a-e56c-f120-66043f01ec6a.png)

Service Credentialの中身を見ていくと以下のような箇所があるはずなので、これをそのままjdbc接続に使う情報として使おう
ポイントはlegacyuser向けの接続ではIBM_SUBSTTOKEN_APIKEYというusernameでpasswordにはapikeyを指定するという点だ
クライアント側のツールによってはユーザー名やパスワードの明示的な入力をチェックしていることもあり、必ずしもjdbcの接続ストリングでapiKey指定のみで接続できるわけではないので、そういう場合にはlegacyuser向けの接続を使うこと

```
    "jdbc": {
      "environment": {},
      "jdbc_url_accesstoken": [
        "jdbc:db2://xxxxx:00000/bludb:securityMechanism=15;accessToken=<accesstoken>;sslConnection=true;"
      ],
      "jdbc_url_api_key": [
        "jdbc:db2://xxxxx:00000/bludb:securityMechanism=15;apiKey=<APIKEY>;sslConnection=true;"
      ],
      "type": "uri"
    },
    "legacy": {
      "certificate": {
        "certificate_base64": 
...

      "legacyuser": [
        {
          "password": "<APIKEY>",
          "securityMechanism": "15",
          "username": "IBM_SUBSTTOKEN_APIKEY"
        }
      ],
      "type": "uri"
    }
  },

```


# 2. Tableauから接続してみよう

実際にTableauからJDBC接続してみよう
Tableau for MacではDb2専用の接続はサポートされていないので汎用JDBCから接続する

Tableu for Macの場合はJDBCドライバーは$HOME/Library/Tableau/Drivers以下から読み込むのでここにDb2のJDBCドライバー(db2jcc4.jar)を配置する

Tableuのアプリを立ち上げてその他のデータベース(JDBC)から汎用JDBC接続をしよう
入力内容は、

- ユーザー名、パスワード入力が強制されているっぽいので、JDBC接続ストリングからapiKeyのプロパティを除こう
- ユーザー名、パスワードはlegacyuser向けの設定を使おう

![TableauJDBC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2084334/0be5d84c-6be1-9db7-a57f-c05d44d7169f.png)

これで接続してみる

![TableauJDBCnoCap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2084334/c12ad265-1d5e-36c0-041e-16604816deeb.png)

接続はいけたっぽい
ただしデータベースの選択のところから何もでてこず先に進めない


# 3. TDCファイルを書こう

このようなUIになっているのは汎用JDBC接続を使用しており、他のDatabase製品ではDatabaseを選択するところからInteractiveにできるようにする必要があるからだと推測されるが、Db2の場合はDatabaseは接続の単位になっていて接続ストリング上にも指定しているのでそもそもInteractiveに選択する必要はない

こういう場合はTableau側でTDCファイルというものでカスタマイズしてあげると対応できるようだ
ポイントは

- TDCファイルの読み込み元はデフォルトだと$HOME/Documents/マイ Tableau リポジトリ/データ ソース配下に配置する
- .tdcという拡張子をつける
- 今回はDatabaseの選択UIをなくすCAP_JDBC_SUPPRESS_ENUMERATE_DATABASESというカスタムプロパティを指定する

最終的に中身はこんな感じ

```file: $HOME/Documents/マイ Tableau リポジトリ/データ ソース/db2.tdc
<?xml version='1.0' encoding='utf-16' ?>
<connection-customization class='genericjdbc' enabled='true' version='2022.2'>
  <vendor name='genericjdbc' />
  <driver name='db2' />
  <customizations>
        <customization name='CAP_JDBC_SUPPRESS_ENUMERATE_DATABASES' value='yes' />
  </customizations>
</connection-customization>

```

これで再度接続してみよう

![TableauJDBCCapYes.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2084334/9fcb3780-88d2-92db-124d-9132f8489d05.png)

今度はスキーマ一覧から選択できるようになっており、その中で表も選択できる
データの中身もちゃんと表示できている
どうやらこれで無事使えそうだ


# 参考

https://help.tableau.com/current/pro/desktop/ja-jp/examples_otherdatabases_jdbc.htm

https://help.tableau.com/current/pro/desktop/ja-jp/connect_customize.htm