BoltDB中最佳数据存储方式

14

我刚接触BoltDB和Golang,正在尝试寻求你的帮助。

所以,我理解只能将字节数组([]byte)保存为BoltDB的键和值。如果我有一个用户结构体如下,其中键将是用户名,则将数据存储到BoltDB中最好的选择是什么,因为它期望字节数组?序列化还是JSON?或者有更好的方式吗?

type User struct {
    name string
    age  int
    location string
    password string
    address string 
}

非常感谢,晚上好。


2
使用json或gob编码的BoltDB良好示例 - Mark
2个回答

21

是的,我建议将User结构体序列化为JSON,然后使用唯一键[]byte切片。不要忘记,序列化为JSON仅包括导出的结构体字段,因此您需要更改结构体如下所示。

另一个例子,请参见BoltDB GitHub页面

type User struct {
    Name string
    Age  int
    Location string
    Password string
    Address string 
}

func (user *User) save(db *bolt.DB) error {
    // Store the user model in the user bucket using the username as the key.
    err := db.Update(func(tx *bolt.Tx) error {
        b, err := tx.CreateBucketIfNotExists(usersBucket)
        if err != nil {
            return err
        }    

        encoded, err := json.Marshal(user)
        if err != nil {
            return err
        }
        return b.Put([]byte(user.Name), encoded)
    })
    return err
}

谢谢你的帮助!非常有帮助! - Gon
11
您可能还希望了解其他序列化格式,例如 Protocol Buffers,可以在编组/解组方面显著提高速度,并提供版本控制等功能。 - Ben Johnson

1
一个不错的选择是Storm包,它可以实现你想要做的事情:
package main

import (
   "fmt"
   "github.com/asdine/storm/v3"
)

type user struct {
   ID int `storm:"increment"`
   address string
   age int
}

func main() {
   db, e := storm.Open("storm.db")
   if e != nil {
      panic(e)
   }
   defer db.Close()
   u := user{address: "123 Main St", age: 18}
   db.Save(&u)
   fmt.Printf("%+v\n", u) // {ID:1 address:123 Main St age:18}
}

正如您所看到的,您不必担心编组,它会为您处理。默认情况下,它使用JSON,但您也可以配置它使用GOB或其他格式:

https://github.com/asdine/storm


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接