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 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。