Talend入門 (3)　～	データベースI/O～

##全体の目的
Talendの超簡単なサンプルジョブを作成して，ETLジョブ開発に必要なスキルを習得することが目的です。

##対象者
ETL / EAI技術者

##環境
|使用環境|バージョン|
|:----:|:------------------|
|OS|Windows10|
|Talend|7.1.1|	
|PostgreSQL|9.6|

##サンプル一覧
以下の順番で習得していきます

|#|内容|
|:----:|:------------------|
|1|[はじめてのTalend](https://qiita.com/airkoda/items/a837d3c5d851d98d2612)|
|2|[ファイルI/O](https://qiita.com/airkoda/items/1cd12c05c6136add7178)|
|**3**|**[データベースI/O（今回）](https://qiita.com/airkoda/items/bc807c920c3adebad837)**|
|4|[tMap](https://qiita.com/airkoda/items/fa4a9c022b5d688698e0)|
|5|[イテレータ](https://qiita.com/airkoda/items/404d2d65eff535b2126c)|
|6|[メタデータ](https://qiita.com/airkoda/items/4b42cf2a86f34abb6c87)|
|7|[Context変数](https://qiita.com/airkoda/items/42d294fca40b81aa20fb)|
|8|[Global Map](https://qiita.com/airkoda/items/1aba0d36905c755deeae)|
|9|[tHashInput/tHashOutput](https://qiita.com/airkoda/items/d9347865190f0f3ab180)|
|10|[エラーハンドリング](https://qiita.com/airkoda/items/85e7c49a9bf6a21db6d5)|
|11|[ロギング](https://qiita.com/y-fujioka-yoshiharu/items/e0280f34cff2e3d00bda)|
|12|[子ジョブ（ジョブのネスト）](https://qiita.com/y-fujioka-yoshiharu/items/04ea4bd74ded382cf03c)|
|13-1|[設定ファイル読み込みオリジナル版](https://qiita.com/airaotaku/items/92f114795108f25e6d0f)|
|13-2|[設定ファイル読み込みコンポ版](https://qiita.com/airyama/items/83c2bf9b2d51a79c3714)|
|14|[tJava](https://qiita.com/airkoda/items/4d81d76c36b6fcbd4d89)|

[サンプルコード（Talendプロジェクトデータ）](https://github.com/kd2air/qiita)

##今回の目的
データベース入出力について理解する。

##サンプルプログラム概要
特定のテーブルを読み込み別のテーブルに出力するプログラムを作ってみます。

##DB読み込み
まずは入力ソースとしてDBのデータを読み込んでみましょう。
今回はローカル環境のpostgresqlを読み込むことにします。以下のようなDBが使える状態でスタートします。

|   | 名称 |  備考 |
|:-----------------|:------------------|:------------------|
| DB名    | qiitadb  | 事前準備 |
| オーナー    | koda  | 事前準備 |
| テーブル名    | testuser  | 下記クエリで準備 |

e.g. cygwinのpsql

```
$ psql -l -U koda -h localhost
ユーザ koda のパスワード:
                                             データベース一覧
   名前    |  所有者  | エンコーディング |      照合順序      | Ctype(変換演算子)  |     アクセス権限
-----------+----------+------------------+--------------------+--------------------+-----------------------
 postgres  | postgres | UTF8             | Japanese_Japan.932 | Japanese_Japan.932 |
 qiitadb   | koda     | UTF8             | Japanese_Japan.932 | Japanese_Japan.932 |
 template0 | postgres | UTF8             | Japanese_Japan.932 | Japanese_Japan.932 | =c/postgres          +
           |          |                  |                    |                    | postgres=CTc/postgres
 template1 | postgres | UTF8             | Japanese_Japan.932 | Japanese_Japan.932 | =c/postgres          +
           |          |                  |                    |                    | postgres=CTc/postgres
(4 行)
```

#### 入力ソース作成
testuserというテーブルおよびデータを準備します。

```sql:testdata.sql
create table testuser (
  id integer primary key,
  name varchar(32) not null,
  gender varchar(32) not null
);
insert into testuser values (1,'kouda','男');
insert into testuser values (2,'mori','男');
insert into testuser values (3,'kubo','男');
insert into testuser values (4,'shimizu','男');
insert into testuser values (5,'aya','女');
```
testdata.sqlでテーブルを準備した状態

```
qiitadb=# \d
            リレーション一覧
 スキーマ |   名前   |    型    | 所有者
----------+----------+----------+--------
 public   | testuser | テーブル | koda
(1 行)

qiitadb=# \d testuser
                       テーブル "public.testuser"
   列   |          型           | 照合順序 | Null 値を許容 | デフォルト
--------+-----------------------+----------+---------------+------------
 id     | integer               |          | not null      |
 name   | character varying(32) |          | not null      |
 gender | character varying(32) |          | not null      |
インデックス:
    "testuser_pkey" PRIMARY KEY, btree (id)

qiitadb=# select * from testuser ;
 id |  name   | gender
----+---------+--------
  1 | kouda   | 男
  2 | mori    | 男
  3 | kubo    | 男
  4 | shimizu | 男
  5 | aya     | 女
(5 行)
```

#### テーブルデータ読み込み
それではサンプルジョブを作成していきましょう。
リポジトリの[ジョブ]を右クリックし[ジョブの作成]を選択します。
[名前]に"dbio"と入力し[Finish]ボタンをクリックします。

![GS000069.png](https://qiita-image-store.s3.amazonaws.com/0/364565/0027a7b1-899f-eecb-04a8-356ac6f01d39.png)

postgreのテーブルデータ読み込みには[tPostgresqlInput]コンポーネントを使います。
[tPostgresqlInput]と読み込みデータ確認用に[tLogRow]を配置します。
※デザインワークスペース上ではデータベースに*PostgreSQL*を選択した[tDBInput]として表示されます。

![GS000073.png](https://qiita-image-store.s3.amazonaws.com/0/364565/efc2486f-6c7d-7b6a-4564-f94a5133dc33.png)

[tDBInput]の[基本設定]にある接続情報を以下のように設定します。

| 項目名              | 設定内容 |
|:-----------------|:------------------|
| ホスト    | localhost  |
| ポート    | 5432  |
| データベース    | qiitadb  |
| スキーマ    | public  |
| ユーザ名    | koda  |
| パスワード    | 環境ごとの設定  |

![GS000076.png](https://qiita-image-store.s3.amazonaws.com/0/364565/56e77478-042e-511f-b45f-31e01fe9eb6f.png)

次にスキーマを定義します。
スキーマの編集ボタンをクリックし、カラム名とタイプを以下のように設定します。

| 列      | カラム |  タイプ |
|:-----------------|:------------------|:------------------|
| 1列目    | id  | int|
| 2列目    | name  | String|
| 3列目    | gender  | String|

![GS000077.png](https://qiita-image-store.s3.amazonaws.com/0/364565/d3550c67-72db-6a2d-4d04-2e11c6c56fd4.png)

最後に実際にデータを取得するためのクエリを設定します。
クエリの右端にあるボタンをクリックします。

![GS000080.png](https://qiita-image-store.s3.amazonaws.com/0/364565/016c5d7e-b7c9-626c-ae62-bf71b74ea88d.png)

接続設定とSQLが正しく設定できると結果取得ができることをここで確認できます。

①SQLを記載します

| 設定内容 |
|:------------------|
| select id, name, gender from testuser  |

②実行アイコンをクリックします。
③結果が確認できます。

![GS000082.png](https://qiita-image-store.s3.amazonaws.com/0/364565/d25969b4-39ca-1dc6-5b9e-69d67f2df69f.png)

[tDBInput]と[tLogRow]をロウでつなぎます。
[tLogRow]の[基本設定]にある[モード]もテーブルにしておきましょう。

![GS000084.png](https://qiita-image-store.s3.amazonaws.com/0/364565/7e9fd280-d4cc-cdb0-db9c-2d222b7d6cf7.png)

これで設定は完了ですので実行してみます。
testuserテーブルが設定どおり読み込めたことを確認できます。

![GS000085.png](https://qiita-image-store.s3.amazonaws.com/0/364565/b346f4f9-5b54-1bce-37d5-678a56c14acb.png)

#### データベース出力の設定

今度は実際のデータベースのテーブルにデータを出力してみます。
[tPostgresqlOutput]というDB出力用のコンポーネントを配置します。
※デザインワークスペース上ではデータベースに*PostgreSQL*を選択した[tDBOutput]として表示されます。

![GS000086.png](https://qiita-image-store.s3.amazonaws.com/0/364565/927ceddf-00f6-71b0-5a4a-23f76de3e063.png)

[tLogRow]と[tDBOutput]をロウでつなぎます。

![GS000087.png](https://qiita-image-store.s3.amazonaws.com/0/364565/244a315a-bbe5-1da7-9b60-01f9534d4d57.png)

[tDBOutput]の[基本設定]にある接続情報を以下のように設定します。
※tDBConnectionやメタデータを使うと設定の使いまわしができます。その辺の解説はまた別途^^

| 項目名              | 設定内容 |
|:-----------------|:------------------|
| ホスト    | localhost  |
| ポート    | 5432  |
| データベース    | qiitadb  |
| スキーマ    | public  |
| ユーザ名    | koda  |
| パスワード    | 環境ごとの設定  |
| **テーブル**    | **out1**  |
| **テーブルへのアクション**    | **テーブルがない場合はテーブルを作成します**|

![GS000088.png](https://qiita-image-store.s3.amazonaws.com/0/364565/1801d42b-add4-99da-e251-aeb06b5909de.png)

次にスキーマを定義します。
[同期カラム]ボタンをクリックすることでロウで流れてくるカラムを自動設定できます。
スキーマの編集ボタンをクリックし、カラム名とタイプが自動設定できていることは確認しておきます。

| 列      | カラム |  タイプ |
|:-----------------|:------------------|:------------------|
| 1列目    | id  | int|
| 2列目    | name  | String|
| 3列目    | gender  | String|

![GS000089.png](https://qiita-image-store.s3.amazonaws.com/0/364565/6de09ab2-e6ac-24ea-43c1-aed609e9c2a1.png)

これで準備は完了です。実行してみましょう。
out1というテーブルが作成され、データが登録されていることが確認できます。

![GS000091.png](https://qiita-image-store.s3.amazonaws.com/0/364565/6cecc0db-8115-8f3a-0b9f-3389fc5b59cb.png)

```
qiitadb=# \d
            リレーション一覧
 スキーマ |   名前   |    型    | 所有者
----------+----------+----------+--------
 public   | out1     | テーブル | koda
 public   | testuser | テーブル | koda
(2 行)

qiitadb=# \d out1
                       テーブル "public.out1"
   列   |        型         | 照合順序 | Null 値を許容 | デフォルト
--------+-------------------+----------+---------------+------------
 id     | integer           |          |               |
 name   | character varying |          |               |
 gender | character varying |          |               |

qiitadb=# select * from out1;
 id |  name   | gender
----+---------+--------
  1 | kouda   | 男
  2 | mori    | 男
  3 | kubo    | 男
  4 | shimizu | 男
  5 | aya     | 女
(5 行)

```

##まとめ
今回はデータベース入出力について確認しました。
サンプルとしてはSQLでもできちゃうレベルの**テーブル複製**でしたが、読み込みと書き出しがコンポーネントの設定だけでできることが確認できたと思います。

あらたに利用したコンポーネントと用途をおさらいしておきます。

- tPostgresqlInput
    - PostgreSQLのテーブルデータの読み込み
- tPostgresqlOutput
    - PostgreSQLのテーブルへデータの書き込み

毎度のことですが、ほんのさわりの部分だけを解説していますのでぜひここから深掘りしてみてください。

##次回以降
次回はいよいよ強力なETL処理を実現するためのメインコンポーネントともいえるtMapをやっていきます。