DBeaverのすすめ〜Excel出力編〜

# 概要

DBeaverは、オープンソースのマルチプラットフォームデータベースツールです。Javaで開発されており、Windows、macOS、Linuxなどの主要なデスクトップOSで動作します。
保守・運用業務をやっていて、Excelへの出力アドオンがよく考えられているなと思ったので、布教がてら共有します。DBeaverは、無料のCommunity版と、有料のPro版があります。今回紹介する機能はどちらでも使用できます。

## 背景と目的

顧客からデータ出力を依頼されたとき、大体はcsvやtsvではなく、Excelでの送付を希望される事が多いと思います。しかしながら、MySQLやPostgreSQLのデータを出力するとき、一番お手軽なのはCSVやTSVだと思います。これらの問題点として、データ中の改行、データ中のカンマのエスケープどうするかなどの問題が発生しますし、うまくExcelへインポートできたとしても毎回text->Excelへのインポートをやるのは面倒です。

加えて、ヘッダーとしてカラム名をつけてほしいと依頼される場合があります。いわゆる、"物理名"ではなく"論理名"のカラム名をつけてほしいとよく言われます。Excelに取り込んだあと、手作業で論理カラム名を追加するのは面倒です。テーブル10個ぐらい依頼されたときはかなりきつい・・・。何らかのプログラミング言語を用いて自動化してしまうのも手ですが、DBeaverを使っていればもっと手軽に実施できます。

## 前提

- DBeaverにて接続できるデータベースである（MySQL, PostgreSQL, ...etc）
- カラム名コメントに物理名が記載してある
- プラグインである 「Office integration」 がインストールされている

## サンプルデータ

テーブル例

```sql
CREATE TABLE `recipes` (
  id INTEGER NOT NULL COMMENT "料理ID",
  dish_name VARCHAR(50) COMMENT "料理名",
  main_ingredient VARCHAR(256) COMMENT "メイン原材料",
  calorie INTEGER NOT NULL COMMENT "カロリー",
  note VARCHAR(256) COMMENT "備考",
  meat_type VARCHAR(256) COMMENT "肉種",
  gun INTEGER NOT NULL COMMENT "基礎食品群",
  dish_category VARCHAR(256) COMMENT "料理区分",
  cooking_method VARCHAR(256) COMMENT "調理法",
  eating_group_id INTEGER COMMENT "食べ合わせグループ",
  PRIMARY KEY (`id`)
);

INSERT INTO recipes VALUES(1, 'ねぎとろ', 'マグロ', 150, "", '魚', 2, '魚料理', '生', 1);
INSERT INTO recipes VALUES(2, 'フレンチトースト', '食パン', 350, "", '-', 4, '穀類料理', '-', 2);
INSERT INTO recipes VALUES(3, '天ぷらそば', 'そば', 500, "", '-', 4, '穀類料理', '-', 3);
INSERT INTO recipes VALUES(4, '刺し身', 'カツオ', 120, "", '魚', 2, '魚料理', '生', 1);
INSERT INTO recipes VALUES(5, 'きつねうどん', 'うどん', 400, "", '-', 4, '穀類料理', '-', 3);

CREATE TABLE `eating_groups` (
  id INTEGER NOT NULL COMMENT "食べ合わせグループID",
  name VARCHAR(50) COMMENT "食べ合わせグループ名",
  PRIMARY KEY (`id`)
);

INSERT INTO eating_groups VALUES(1, 'ごはん');
INSERT INTO eating_groups VALUES(2, 'パン');
INSERT INTO eating_groups VALUES(3, 'そば・うどん');
```

## Excel出力手順

### Office integration インストール

[Extension Office · dbeaver/dbeaver Wiki](https://github.com/dbeaver/dbeaver/wiki/Extension-Office#installation-in-the-ce-version) を参考にインストールします。

- DBeaverを起動し、上部メニュー「ヘルプ」> 「Install New Software...」
- 「Work with」に `https://dbeaver.io/update/office/latest/` をペーストしそのまま Enterキー押下
- `DBeaver Office Support`にチェックを入れる

![dbeaver-office-integration.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139537/b9b342dc-2a4e-3561-057b-34a4db93d8c1.png)

- 「次へ」押下
- インストールされるので「終了」
- 「Trust Authorities」モーダルが出現するので確認し、問題なければ「Select All」にチェック
- 「Trust Selected」押下

![dbeaver-trust-selected.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139537/c65efa5f-e074-04c3-c8c3-98026e7d8e60.png)

- 「Trust Artifacts」も同様に「Select All」にチェック
- 「Trust Selected」押下
- Restart DBeaver

![dbeaver-trust-artifacts.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139537/1ca80906-0a09-9aec-c244-94bb6002de60.png)

:::note info
Trust設定は
メニューバー > ウィンドウ > 設定 で設定ダイアログを起動したあと
左メニューの「一般」 > Install/Update > Trust の 「Authorities」タブで管理できます
:::

### テーブルをExcel出力してみる

- 適当なテーブルを開く（サンプルとして`recipes`テーブルで説明します）
- メインペインでテーブルを開きます
- メインペインの下部「結果セットのエクスポート」押下

![dbeaver-export.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139537/b5fda5c6-a5ee-e5d8-31f6-42a18fa362a9.png)

- Export target: XLSXを選択 > 次へ
- Extraction setting: そのまま次へ
- Format settings: Header formatを「description」か「both」にします
- 出力: Directoryやファイル名パターンを適当に設定し、任意の場所に出力します

出力例 「description」
![dbeaver-recipes-export-description.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139537/e28da5e6-6aa8-8288-915c-a21094d67900.png)
「description」を選択するとヘッダーに論理名が入ります。

出力例 「both」
![dbeaver-recipes-export-both.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139537/846aa97d-bd5a-81f3-46a5-4a661eb4ce2e.png)
「both」を選択すると1行目が物理名、2行目が論理名になります

### 任意のクエリをExcel出力してみる

任意のクエリでもしっかり物理名が格納されたExcelを出力することができます。下記クエリを実行し、同様に、メインペインの下部「結果セットのエクスポート」を押下します。

```sql
select
  r.id,
  r.dish_name ,
  r.eating_group_id ,
  eg.name
from
  recipes r
join eating_groups eg on
  r.eating_group_id = eg.id ;
```

出力例 「description」
![dbeaver-export-join-table.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139537/73019e7f-437f-f233-55e9-0bb2120f255e.png)
結合した`eating_groups`テーブルの物理名も格納されます。

## ワンタッチ出力機能 (Task)

あらかじめ指定したテーブルやクエリ、出力設定をtaskとして記録しておき、ワンタッチで出力できる機能が便利です。先程の任意クエリをtask化してワンタッチで出力できるようにしてみます。

- 上部メニュー > データベース > Tasks > Create new task ...
- 適当なName、Descriptionを入力し、Common > Data exportを選択
- 「次へ」押下

![dbeaver-create-task.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139537/ba137262-206d-d02b-d887-c162b1911246.png)

- 「Add Query...」押下
- データベース接続先一覧（データベースナビゲータと同様のもの）が出現するので、サンプルとして作成したデータベースを選択
- 先程のクエリを入力し「OK」
- 次へを押下すると、先程同様の出力設定画面が現れるので省略
- 設定が完了すると、上部メニュー > データベース > Tasks > に新しいタスクが現れ、ワンタッチで出力できるようになる

![dbeaver-sample_export_recipes.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139537/d22e1219-951f-9fad-cf58-14c00dc2ca32.png)

以上です