🦆

DuckDB と Go

2023/06/20に公開

2023年6月3回目です。

今回は、DuckDB についてです。

ぼくが DuckDB に興味を持ったのは、Thoughtworks 社の Technology Radar を読んでからです。

https://www.thoughtworks.com/radar/platforms/duckdb

記事の作成時点では、公式の言語に Go の紹介はありません。

そのため、Go で Query を実行する方法について書きます。

今回使用した Code は、こちらです。

TL;DR

  • OLAP の RDBMS です。
  • 軽量な DB で、CSV や Parquet を直接 Query できます。

Installation

  • Dev Container 環境と VS Code の Extension を使用します。

https://github.com/danny-yamamoto/go-duckdb-example/blob/21714afbb3b9b7900ffc452cd89e8c9bc00382a7/.devcontainer/devcontainer.json#L9

  • Dev Container を起動後、DuckDB の binary が存在することを確認してください。
vscode ➜ /workspaces/go-duckdb-example (main) $ sudo find / -name duckdb
/usr/bin/duckdb
vscode ➜ /workspaces/go-duckdb-example (main) $
  • PATH を設定します。
vscode ➜ /workspaces/go-duckdb-example (main) $ export PATH="/usr/bin:$PATH"
vscode ➜ /workspaces/go-duckdb-example (main) $ source ~/.bashrc
  • DuckDB の動作を CLI で確認します。
    CSV を参照できていることが確認できます。
vscode ➜ /workspaces/go-duckdb-example (main) $ cat hoge.csv 
a,1,c
aa,2,cc
vscode ➜ /workspaces/go-duckdb-example (main) $ duckdb
v0.8.1 6536a77232
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
D SELECT * FROM read_csv_auto('hoge.csv');
┌─────────┬─────────┬─────────┐
│ column0 │ column1 │ column2 │
│ varchar │  int64  │ varchar │
├─────────┼─────────┼─────────┤
│ a       │       1 │ c       │
│ aa      │       2 │ cc      │
└─────────┴─────────┴─────────┘
D .exit
vscode ➜ /workspaces/go-duckdb-example (main) $ 

Usage

  • Query 用の CSV を用意します。

  • github.com/marcboeker/go-duckdb を blank import します。

  • 認証は、必要ありません。DuckDB の binary を指定します。

https://github.com/danny-yamamoto/go-duckdb-example/blob/21714afbb3b9b7900ffc452cd89e8c9bc00382a7/main.go#L11

  • 実行結果
    sql.Open 以外、通常の database の扱いと変わりません。当然ながら。
vscode ➜ /workspaces/go-duckdb-example (main) $ go run main.go 
column0: a
column0: aa
vscode ➜ /workspaces/go-duckdb-example (main) $

Summary

Go で Query を実行する方法について書きました。
DuckDB の Usecase として考えられるのは、Backend Engineer が分析系の API を実装する場合でしょうか。例えば、Python よりも Go で実装したい場合。

Discussion