🦆

DuckDB と Go

2023/06/20に公開
1

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

makoto_mmakoto_m

貴重な記事ありがとうございました。
初心者で申し訳ございません。
Windows10でGo+duckdbを試したいのですが公式通りに試しているのですがうまくいきません。
何か方法が間違っているのでしょうか・・。
gccライブラリにTDM-GCC-64をつかっていてGo+sqlite3や
postgresqlのコンパイルと実行はできました。

ところがduckdbの場合は実行しようとすると下記のエラーとなります。
なにかご存じでしたら教えていただけないでしょうか。。
Qiitaでも質問しているのですが回答をいただけないようです。

今後ともGoの記事をよろしくお願いいたします。

command-line-arguments

C:\Program Files\Go\pkg\tool\windows_amd64\link.exe: running gcc failed: exit status 1
C:/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\m_yan\AppData\Local\Temp\go-link-2174085785\000002.o: in function _cgo_f9e122a25730_Cfunc_duckdb_append_data_chunk': /tmp/go-build/cgo-gcc-prolog:56: undefined reference to __imp_duckdb_append_data_chunk'
C:/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\m_yan\AppData\Local\Temp\go-link-2174085785\000002.o: in function _cgo_f9e122a25730_Cfunc_duckdb_appender_column_count': /tmp/go-build/cgo-gcc-prolog:74: undefined reference to __imp_duckdb_appender_column_count'
C:/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\m_yan\AppData\Local\Temp\go-link-2174085785\000002.o: in function _cgo_f9e122a25730_Cfunc_duckdb_appender_column_type': /tmp/go-build/cgo-gcc-prolog:93: undefined reference to __imp_duckdb_appender_column_type'
C:/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\m_yan\AppData\Local\Temp\go-link-2174085785\000002.o: in function _cgo_f9e122a25730_Cfunc_duckdb_appender_create': /tmp/go-build/cgo-gcc-prolog:115: undefined reference to __imp_duckdb_appender_create'
C:/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\m_yan\AppData\Local\Temp\go-link-2174085785\000002.o: in function _cgo_f9e122a25730_Cfunc_duckdb_appender_destroy': /tmp/go-build/cgo-gcc-prolog:134: undefined reference to __imp_duckdb_appender_destroy'
C:/TDM-GCC-64/bin/../lib/gcc/x86_64-w64-mingw32/10.3.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\m_yan\AppData\Local\Temp\go-link-2174085785\000002.o: in function _cgo_f9e122a25730_Cfunc_duckdb_appender_error': /tmp/go-build/cgo-gcc-prolog:152: undefined reference to __imp_duckdb_appender_error'