【问题标题】:Best way to store data in BoltDB在 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 
}

非常感谢,祝你晚安

【问题讨论】:

标签: json serialization go store boltdb


【解决方案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 := 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

【讨论】:

    猜你喜欢
    • 2020-07-09
    • 1970-01-01
    • 2012-04-18
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    • 2013-09-10
    相关资源
    最近更新 更多