# MySQL Tables Export Integration CLI

CLIを使用してクエリを発行し、結果を出力することができます。以下の手順では、CLIを使用してクエリ出力結果をフォーマットする方法を説明します。

## TD Queryコマンドの使用方法

単一のクエリの結果をMySQLサーバーに出力するには、`td query`コマンドに`--result`オプションを追加します。ジョブが完了すると、結果がデータベースに書き込まれます:


```
$ td query --result 'mysql://user:password@host/database/table' \
  -w -d testdb \
  "SELECT code, COUNT(1) FROM www_access GROUP BY code"
```

## スケジュールされたジョブ

出力が体系的にMySQLに書き込まれるスケジュールされたクエリを作成するには、`td sched:create`コマンドでスケジュールを作成する際に`--result`オプションを追加します。ジョブが実行されるたびに、結果が`mytbl`に書き込まれます。


```
$ td result:create mydb mysql://user:password@host/database
$ td sched:create hourly_count_example "0 * * * *" -d testdb "select count(*) from www_access" --result mydb:mytbl
```

## 結果出力URLフォーマット

結果出力先は、以下の形式のURLで表されます:


```
mysql://username:password@hostname:port/database/table
```

ここで:

- **mysql** は、MySQLへの結果出力を示します
- **username** と **password** は、MySQLサーバーへの認証情報です
- **hostname** は、MySQLサーバーのホスト名です
- **port** は、MySQLサーバーにアクセスできるポート番号です。「:」はオプションであり、デフォルトでは3306と想定されます
- **database** は、宛先データベースの名前です
- **table** は、上記のデータベース内のテーブルの名前です。クエリ出力の実行時に存在しない場合もありますが、その場合はユーザーのために指定された名前のテーブルが作成されます


## オプション

ジョブ結果のMySQLサーバーへの書き込みは、以下のオプションをサポートしています。

### データを変更するモード（Append/Replace/Truncate/Update）

データを4つの方法で追加または削除できます。


```
mysql://user:password@host/database/table               # append
mysql://user:password@host/database/table?mode=append   # append
mysql://user:password@host/database/table?mode=replace  # replace
mysql://user:password@host/database/table?mode=truncate # truncate
mysql://user:password@host/database/table?mode=update   # update
```

4つのモードすべてが**アトミック**です。

**「host」セクションでは、ポートも指定できます。** 以下は例です:


```
mysql://superadmin:superstrongpassword@data.science.com:27013/transaction/user_info
```

#### APPEND

これはデフォルトのモードです。クエリ結果はテーブルに追加されます。テーブルが存在しない場合は、新しいテーブルが作成されます。

#### REPLACE

テーブルがすでに存在する場合、既存のテーブルの行はクエリ結果で置き換えられます。テーブルが存在しない場合は、新しいテーブルが作成されます。

**単一のトランザクション**で以下の3つのステップを実行することにより、**アトミック性**（テーブルのコンシューマーが常に一貫性のあるデータを持つように）を実現します。

1. 一時テーブルを作成します。
2. 一時テーブルに書き込みます。
3. ALTER TABLE RENAMEを使用して、既存のテーブルを一時テーブルで置き換えます。


replaceモードを使用すると、MySQLテーブルのスキーマが変更される可能性があります。ターゲットテーブルへのスキーマ変更を避けるには、「Preserve schema?」オプションを選択してください。

#### TRUNCATE

システムは最初に既存のテーブルをトランケートし、次にクエリ結果を挿入します。テーブルが存在しない場合は、新しいテーブルが作成されます。

**REPLACEとは異なり、TRUNCATEはテーブルのインデックスを保持します。**

#### UPDATE

このモードは、以下のステップを実行することにより、新しいデータを挿入し、既存のデータを更新します。

1. 一時テーブルを作成します。
2. 一時テーブルに書き込みます。
3. 一時テーブルから宛先テーブルにデータを更新します。
4. 一時テーブルから宛先テーブルに残りのデータを挿入します。


一意キーを指定するには、`unique`パラメータを設定できます。これはキーのカンマ区切りのリストです。すべてのキーの値が既存のレコードのすべてと一致する場合、そのレコードは置き換えられます。以下は例です:


```
mysql://superadmin:superstrongpassword@data.science.com:27013/transaction/user_infomode=update&unique=column1%2Ccolumn2
```

CLIでは、パラメータ内のカンマはURLエンコードする必要があります（「,」は「%2C」にする必要があります）。

### 追加オプション

ジョブ結果のMySQLサーバーへの書き込みは、オプションのURLパラメータとして指定できる以下の追加オプションをサポートしています。

## sslオプション

**ssl**オプションは、MySQLサーバーへの接続にSSLを使用するかどうかを決定します。

### ssl=true

Treasure DataからMySQLサーバーへの接続にSSLを使用します。MySQLサーバーは、SSL接続を受け入れるように設定されている必要があります。


```
mysql://user:password@host/database/table?ssl=true
```

### ssl=false（デフォルト）

Treasure DataからMySQLサーバーへSSLを使用しません。


```
mysql://user:password@host/database/table?ssl=false
```

#### 文字エンコーディング

Treasure Dataは常に文字エンコーディングとしてUTF-8を使用します。また、デフォルトでUTF-8を使用するようにデータベースを設定する必要があります。エンコーディングに関連する問題が発生した場合は、以下の設定を確認してください。


```
mysql> show variables like 'char%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
```

#### MySQLのINT UNSIGNED型

MySQLへのジョブ結果は、MySQLのINT UNSIGNED型をサポートしていません。その値は予期しない値に変換されます。