2020/05/04

[golang]手軽そうなkey value storeタイプのDB

golangの勉強をしているが、ちょっとしたデータ保存をしたいと思った。
大げさに言えばデータの永続化だが、プロセスを終了させてもデータが残っているようにしたいだけだ。

 

SQLiteを考えたが、大して検索などしないならkey value storeタイプでもよいだろう。
Cでlmdbを使っていたので、その辺で探してみた。

 

なんとなく手軽そうなので、bboltを使ってみよう。
boltdb/boltというリポジトリがオリジナルだったようだが、そちらはarchiveになっていた。


ちょっとチュートリアルをやって終わろうと思ったが・・・説明が長い!
DBだし、lmdbをベースにしているとなるとマルチプロセスやらマルチスレッドやらgoroutineやらあるので、ちゃんと説明がいるのだろう(読んでないけど)。

 

クロージャーとかいうものを使っているらしい。
他の言語でも聞いたことがある単語だが、まあスルーさせてもらおう。

よくわかってないが、bucketというものを作ってアクセスするようだ。Put/GetがBucketにしかないしね。
lmdbのmdb_dbi_open()で指定するnameのようなものだろうか。

01: package main
02: 
03: import (
04:     "log"
05: 
06:     "go.etcd.io/bbolt"
07: )
08: 
09: func main() {
10:     db, err := bbolt.Open("./db.bbolt", 0666, nil)
11:     if err != nil {
12:         log.Fatalf("%v\n", err)
13:     }
14:     defer db.Close()
15: 
16:     err = db.Update(func(tx *bbolt.Tx) error {
17:         b, err := tx.CreateBucket([]byte("MyBucket"))
18:         if err != nil {
19:             if err == bbolt.ErrBucketExists {
20:                 b = tx.Bucket([]byte("MyBucket"))
21:             } else {
22:                 log.Fatalf("create bucket: %v\n", err)
23:             }
24:         }
25:         err = b.Put([]byte("answer"), []byte("42"))
26:         return err
27:     })
28:     if err != nil {
29:         log.Fatalf("update: %v\n", err)
30:     }
31:     err = db.View(func(tx *bbolt.Tx) error {
32:         b := tx.Bucket([]byte("MyBucket"))
33:         v := b.Get([]byte("answer"))
34:         log.Printf("The answer is: %s\n", v)
35:         return nil
36:     })
37:     if err != nil {
38:         log.Fatalf("view: %v\n", err)
39:     }
40: }

 

まあ、サンプルが動いただけなので、これでいいのかどうかはよくわからん。
追々だ、追々。

追記:
今回の使い方だったら、CreateBucketIfNotExists()の方がよさそうだ。

 

最初、これをWindows10のWSLで動かそうとしたのだが、db.Update()の方は通るもののdb.View()の方で落ちてしまった。DBファイルが存在すると動く。
Linuxの方だと問題なく動くので、これはWSLでlmdbを動かしたときと同じくファイルシステムの問題だろう。
WSL2に期待しております。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。

注: コメントを投稿できるのは、このブログのメンバーだけです。