LoginSignup
5
4

EmbulkでPostgreSQLからデータ抽出してCSVを生成する方法

Last updated at Posted at 2023-10-30

git cloneすればembulkやgolangのインストールは不要です

以下のリポジトリにハンズオンを用意しています。dockerやmakeコマンドを用意して環境構築をスキップできるようにしているので、ぜひcloneしてハンズオンをしてみてください。

ハンズオンの手順

ここに列挙してある手順を実行したらpostgresにテーブルを作ってデータを登録し、そのデータをEmbulkを使ってcsv化することができます。
うまくいかない箇所などありましたらコメントいただけたらと思います。記載漏れの可能性があります。

  1. git clone https://github.com/tkanata/embulk-hands-on-postgresql2csv.git
  2. docker-compose build
  3. docker-compose up -d
  4. make init
    a. postgresにテーブルを生成するmakeコマンドです。
  5. config.ymlの作成
    a. 今回はすでに作成済みですが、削除して自分で書いてみるのもいいと思います。
  6. docker exec -it embulk bash
    a. dockerコンテナの中に入るコマンド。
  7. embulk run config.yml
    a. コンテナ内でのembulkコマンドの実行。これで./output_file/直下にteas.csvが生成されるはず。

DB構築

docker-compose upあるいはdocker-compose up -dコマンドを叩くことでpostgresの環境が構築されます。
テーブルの生成についてはentというgolangのライブラリを用いて行なっていきます。

entでテーブル生成

make initあるいはmake init-arm64コマンドを叩いたらposrgresにテーブルが生成されるようになっています。

postgresqlからcsvを生成するconfig.ymlの作成

config.yml
in:
  type: postgresql
  host: postgres
  port: 5432
  user: postgres
  password: password
  database: embulk-handson
  table: teas
  select: "*"

out:
  type: file
  path_prefix: ./output_file/
  sequence_format: "teas."
  file_ext: csv
  formatter:
    type: csv
    delimiter: ","
    newline: CRLF
    newline_in_field: LF
    charset: UTF-8
    quote_policy: MINIMAL
    quote: '"'
    escape: "\\"
    null_string: "\\N"
    default_timezone: "Asia/Tokyo"
    header_line: true

docker-composeを利用している場合、ホストマシンのサービスにアクセスする際にはサービス名(postgres)を利用できるため、inputの設定のhostはpostgresを指定しています。
ここをlocalhostにしてしまうと、Dockerコンテナ内のlocalhostを探してしまうため、DBへの接続エラーが発生してしまいます。

config.yml削除して再作成したら、docker-compose buildコマンドを再実行してください。

Dockerfileを読むとわかるのですが、ホストマシン(つまりあなたが今使っている手元のPC)にあるconfig.ymlをDockerコンテナにCOPYするコマンドが記載されています。
config.ymlがDockerコンテナ内に存在しないとembulkコマンドは失敗するので注意してください。
git cloneした時のconfig.ymlを使っている場合は最初に実行したbuildコマンドでconfig.ymlがDockerコンテナにCOPYされているので再度buildコマンドを実行する必要はありません。

Embulkの実行

docker exec -it embulk bashを実行し、Dockerコンテナの中に移動します。
Dockerコンテナに移動できたら、embulk run config.ymlを叩くことでembulkが実行されます。
実行すると指定したディレクトリにcsvが生成されているはずです。

Embulkをローカルにインストールしたい方は以下を参考にするといいかと思います

intel版のMacを使っている方はbrew install embulkでインストールできます。
M1Macを使用している場合は、このコマンドではインストールできません。
下記記事を参考にして、intel環境のシェルでインストールしてください。

M1 macでIntelな環境のシェルを使ったCronジョブを流したりする

embulk-input-postgresqlというプラグインのインストール

Embulkでpostgresqlからデータを取得するためには、embulk-input-postgresqlというプラグインが必要となります。
https://github.com/embulk/embulk-input-jdbc/tree/master/embulk-input-postgresql

プラグインをインストールする前にプラグインを管理する準備をしましょう

Embulkはさまざまなpluginをインストールすることで各種DBからデータを抽出したり、任意のcsvを生成するように拡張することができます。

pluginのインストールはGemのインストールという形で行われます。
GemはGemfileにて管理されるのですが、GemfileによるGemの管理をしやすくするのがmkbundleというコマンドです。

embulk mkbundle bundleというコマンドを実行すると、実行場所にbundleというディレクトリが作成されます。
bundle直下にはGemfileなどが生成され、このGemfileを編集することでGemを管理することができます。

bundle/Gemfileにてgemの管理を行うためには、以下のようにbundleディレクトリ配下でpluginをインストールします。
bundle add PLUGIN-NAME

最後に、bundleディレクトリ直下で以下を実行してgemをインストールします。
bundle install

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4