在 BoltDB 中存储数据的最佳方式
Posted
技术标签:
【中文标题】在 BoltDB 中存储数据的最佳方式【英文标题】:Best way to store data in BoltDB 【发布时间】:2016-07-19 06:56:06 【问题描述】:我是 BoltDB 和 Golang 的新手,正在寻求您的帮助。
所以,我知道我只能为 BoltDB 的键和值保存字节数组 ([]byte)。如果我有一个如下的用户结构,并且键是用户名,那么将数据存储到需要字节数组的 BoltDB 中的最佳选择是什么?
序列化它还是 JSON?还是更好的方法?
type User struct
name string
age int
location string
password string
address string
非常感谢,祝你晚安
【问题讨论】:
Good BoltDB example using json or gob encoding 【参考方案1】:是的,我建议将 User
结构编组为 JSON,然后使用唯一键 []byte
切片。不要忘记,编组为 JSON 仅包括导出的结构字段,因此您需要更改结构,如下所示。
另一个例子,见BoltDB GitHub page。
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
【讨论】:
感谢您的帮助!很有帮助! 您可能还想研究其他序列化格式,例如 Protocol Buffers,它可以显着加快编组/解组并提供版本控制等功能。【参考方案2】: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 := useraddress: "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
【讨论】:
以上是关于在 BoltDB 中存储数据的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章