Bobb确实是一个值得关注的轻量级数据库工具。它基于bbolt构建,在简单性和功能性之间取得了很好的平衡。以下是一个基本的使用示例:
package main
import (
"fmt"
"github.com/jayposs/bobb"
)
func main() {
// 打开数据库
db, err := bobb.Open("test.db")
if err != nil {
panic(err)
}
defer db.Close()
// 写入数据
err = db.Put("bucket1", []byte("key1"), []byte("value1"))
if err != nil {
panic(err)
}
// 读取数据
value, err := db.Get("bucket1", []byte("key1"))
if err != nil {
panic(err)
}
fmt.Printf("Value: %s\n", value)
// 遍历bucket中的所有键值对
err = db.ForEach("bucket1", func(k, v []byte) error {
fmt.Printf("Key: %s, Value: %s\n", k, v)
return nil
})
if err != nil {
panic(err)
}
}
Bobb的API设计简洁明了,主要操作都封装在几个核心方法中。对于需要事务的操作:
// 使用事务进行批量操作
err = db.Update(func(tx *bobb.Tx) error {
// 在事务中创建bucket
bucket, err := tx.CreateBucketIfNotExists([]byte("users"))
if err != nil {
return err
}
// 批量写入数据
users := map[string]string{
"user1": "Alice",
"user2": "Bob",
"user3": "Charlie",
}
for key, value := range users {
err = bucket.Put([]byte(key), []byte(value))
if err != nil {
return err
}
}
return nil
})
查询操作的示例:
// 范围查询
err = db.Range("bucket1", []byte("key1"), []byte("key5"),
func(k, v []byte) error {
fmt.Printf("Range - Key: %s, Value: %s\n", k, v)
return nil
})
// 前缀查询
err = db.Prefix("bucket1", []byte("user_"),
func(k, v []byte) error {
fmt.Printf("Prefix - Key: %s, Value: %s\n", k, v)
return nil
})
Bobb的轻量级特性使其特别适合嵌入式系统、配置存储和小型应用。基于bbolt的架构保证了ACID兼容性,同时保持了出色的读写性能。代码库简洁(约500行),易于理解和定制,这是相比大型ORM工具的一个显著优势。