DBeaverでデータベースからのCSVエクスポートをお手軽に自動化する

2020.04.08

こんにちは。データアナリティクス事業本部の松村です。ジョインブログを投稿してから2ヶ月以上経ってしまいましたが、ようやく2本目に漕ぎ着けました。これからはもう少しペースを上げていきたいです!

今回はデータベースからのCSVエクスポートを自動化する方法を紹介します。 ツールとしてDBeaverを使用します。Windows/Mac/Linuxと、主要なデスクトップOSで動作し、機能も多彩です。以前も弊社ブログでご紹介したことがあります。

DBeaver Community | Free Universal Database Tool
複数のデータソース(Redshiftや主要RDBMS等)及びOS(Mac/Windows/Linux)対応の無償SQLクライアントツール『DBeaver』

DBeaverにはTaskというDBに対する定形作業を自動化する機能があり、これを使います。実際の運用においてはこういった作業はシステムの一部として、失敗時のアラート通知、自動リトライなどいろいろなことを考えて堅牢に実装/設定しなければいけません。でも開発環境で使うだけならこういったデスクトップアプリケーションでお手軽に実行するというのはありだと思います。特に、長期に渡って定期的に実行するわけではないけれど、任意のタイミングで何度か実行したい、といった作業には有効でしょう。

基本的な使い方

では実際の操作を説明していきましょう。

まずは、エクスポートしたいデータベースをデータベースナビゲータに追加します。
ここでは説明用にPostgreSQLのサンプルデータベースを構築し、それを指定しています。

メニューからデータベース -> Tasks -> Create new task ...を選択します。

Task typeのツリービューにいくつか Taskのテンプレートが表示されていますね。どれも役に立ちそうですが、CSV出力を行うために、今回はData exportを選択します。あとでTaskを識別するために、適切な名前と説明を入力して次へ(N) >をクリックします。

まだエクスポートする対象が何も設定されていない状態です。まずはAdd Table ...をクリックして、テーブルを指定します。
Add Query ...で任意のSQLを指定することもできますが、それは後ほど説明します。

最初にデータベースナビゲータに登録したデータベースが表示されます。展開していって、エクスポートしたいテーブルを選択し(複数同時選択が可能です)、OKをクリックします。
テーブルだけでなく、ビューも指定することが可能です。

選択したテーブルがリストに追加されました。次へ(N) >をクリックします。

出力するフォーマットを選択して次へ(N) >をクリックします。
今回はCSVを選択しますが、他にも様々なフォーマットに対応しています。

エクスポート時の接続設定や、CSVの細かいフォーマットを指定できます。用途に応じて設定し、次へ(N) >をクリックします。

エクスポートしたファイルの出力先やエンコーディングを指定して次へ(N) >をクリックします。
エンコーディングの初期設定はUTF-8ですが、CSVをMicrosoft Excelで開く可能性があるのなら、エンコーディングはUTF-8のまま、BOMを挿入にチェックを付けることを強くお勧めします。

実行前の最後の確認画面です。開始をクリックすると、ここまでの設定を保存した上でエクスポートが始まります。
今すぐ実行しない場合は、Save taskをクリックすれば設定内容の保存だけが行われますので、その後でキャンセルをクリックします。

エクスポートが完了すると、このようなダイアログが表示されます。
それでは出力先のフォルダを見てみましょう。

CSVが出力されていますね。これが基本的な使い方です。

保存したTaskの再実行

保存したTaskは、メニューからデータベース -> Tasks -> Database Tasksを選択するなどして一覧表示することができます。

一覧から実行したいTaskを右クリック、Run taskを選択すれば実行することができます。

応用その1 - SQLでエクスポートする

先ほどは省略しましたが、テーブルやビューを指定する代わりに、SQLで加工したデータをエクスポートすることもできます。
タスクに名前を付けた次の画面でAdd Query ...をクリックすると、SQL実行対象のデータベース選択の画面が開きます。選択してSelectをクリックします。

任意のSQLを記述してOKをクリックします。
ここではrentalテーブルからrental_dateが2005年6月のものを抽出しています。

エクスポート対象のリストの中にSQL文が追加されました。この先の流れはテーブル/ビューを指定した場合と同じです。
ひとつのTaskにテーブル/ビューとSQLを混在させることもできます。

応用その2 - Taskを他のPCに移行する

作成したTaskは他のPCでも実行できるようになると嬉しいですよね。しかし標準機能ではTaskの内容をファイルなどに書き出すことができません。うーん、残念。
しかしTaskの保存ができるということは、必ずどこかのファイルにその設定内容が保持されているはずです。というわけで探してみました。

注意:
この先の内容は公式ドキュメントに記載されたものではなく、必ずしもこのとおりの手順で動作しないかもしれません。今は動作しても、今後のバージョンアップにより使用できなくなる可能性もあります。あまり多大な期待をせずにご覧ください。
また、移行先PCの設定ファイルを直接編集しますので、編集前のファイルのバックアップを取ってからお試しください。

保存したTaskは、tasks.jsonというJSONファイルに保存されています。ディレクトリはプラットフォームによって異なっており、以下のとおりです。

Windows
%APPDATA%\DBeaverData\workspace6\General\.dbeaver
Mac
~/Library/DBeaverData/workspace6/General/.dbeaver
Linux
$XDG_DATA_HOME/DBeaverData/workspace6/General/.dbeaver

tasks.jsonの中身はこのようになっています。

{
    "Taskの内部ID": {
        ...
    },
    "Taskの内部ID": {
        ...
    },
    ...
}

ここからコピーしたいTaskをIDごとコピーし、移行先PCのtasks.jsonに貼り付けます。
コピーしたJSONの中、下記のoutputFolderの値にCSVの出力先が埋まっていますので、それを移行先の環境に合わせて書き換えます。これは完全な形式のフルパスでなくてはいけません。~/でホームディレクトリを指定したり、環境変数を埋め込んだりすることはできません。

{
    "Taskの内部ID": {
        ...,
        "state": {
            ...,
            "configuration": {
                ...,
                "StreamTransferConsumer": {
                    ...,
                    "outputFolder": "...",
                    ...

tasks.jsonの中にはDBの接続情報も埋まっています。ただし記述されているのは接続先ホストなどの具体的な情報ではなく、データベースナビゲータに登録されているものの内部IDです。
Taskの中の出力対象でテーブル/ビューを指定したものはentityId、SQLで記述したものはdataSourceの値として記述されています。移行先PCにもこれらと同じIDでDB接続情報を登録します。

{
    "Taskの内部ID": {
        ...,
        "state": {
            "producers": [
                {
                    "type": "databaseTransferProducer",
                    "location": {
                         "type": "entity",
                         "project": "General",
                         "entityId": "接続情報の内部ID/データベース名/スキーマ名/テーブル名"
                     }
                 },
                 ...,
                 {
                     "type": "databaseTransferProducer",
                     "location": {
                         "type": "query",
                         "project": "General",
                         "dataSource": "接続情報の内部ID",
                         "query": "SQL文"
                     }
                 },
                 ...

IDに対応するDBの接続情報は、tasks.jsonと同じディレクトリのdata-sources.jsonに記載されています。こちらの中身はこのようになっています。

{
    "folders": {},
    "connections": {
        "接続情報の内部ID": {
            ...
        },
        "接続情報の内部ID": {
            ...
        },
        ...
    },
    "connection-types": {
        ...
    }
}

ここからtasks.jsonに埋まっているのと同じIDの接続情報をIDごとコピーし、移行先PCのdata-sources.jsonに貼り付けます。

以上で移行作業は終わりです。

移行先のPCでDBeaverを起動します。既に起動済みだった場合は、設定ファイル再読み込みのために、一旦終了してから起動し直します。

これまでの画面コピーはWindowsのものでしたが、移行した実感を出すために、この先はLinuxの画面を使用します。

prepareは元からあったもので、dvdrentalが今回移行した接続情報です。
ではこのツリーを展開してdvdrentalに接続してみましょう。

あれ、エラーになってしまいました。これはdata-sources.jsonにはユーザ名やパスワードは記載されておらず、移行もされていないためです。

ユーザ名とパスワードは、data-sources.jsonと同じディレクトリのcredentials-config.jsonに記録されていると思われますが、これは拡張子に反して中身はバイナリファイルですので、移行はできないと思った方が良いです。
でもご心配なく。移行した接続情報はDBeaverの画面で再編集可能ですので、そこで改めてユーザ名とパスワードを入力すればOKです。再編集するためには、データベースナビゲータで対象のDB接続を右クリック、編集 Connectionを選択します。

Taskの一覧を見てみると、ちゃんと移行したものが表示されています。ではこれを実行してみます。

ちゃんとCSVがエクスポートされました!

それなりに手間がかかるので、ちょっとしたTaskであれば最初から登録し直したほうが早そうですが、複雑なSQLを多数使用したTaskを他のPCで実行したいときは、この方法も(自己責任で)お試しください。

最後に

今回はCSVの出力についてご紹介しましたが、手順の途中で見たように、エクスポートできるデータのフォーマット、また実行できるタスクの種類には他にも色々なものがあります。そちらもぜひ試してみてください。