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