boltDB的运用与实践

举报
MJ_C 发表于 2023/11/10 18:27:41 2023/11/10
【摘要】 本文档记录了BoltDB从安装到实现基本增删改查功能的GoLang实现过程。 环境:OS=Win10;GoVersion=1.19;IDE=VSCode

BoltDB入门实践

本文档记录了BoltDB从安装到实现基本增删改查功能的GoLang实现过程。

环境:OS=Win10;GoVersion=1.19;IDE=VSCode

1、安装

进入某一个含有go.mod文件的文件夹下,安装boltdb软件包:

go get github.com/boltdb/bolt

2、创建DB文件

使用下面的代码(在main函数中)创建一个my.db数据库。

db, err := bolt.Open("my.db", 0600, nil)
if err != nil {
    log.Fatal(err)
}
defer db.Close()

注释:

  • 这个数据库是不可以直接打开的!
  • 函数bolt.Open的作用是打开一个.db文件。如果本身不存在默认新建一个空的。各个参数的含义如下:
    • "my.db":数据库文件的名称,可以自定义,也可以使用绝对路径或相对路径。
    • 0600:文件权限,表示只有文件所有者具有读写权限,其他用户没有任何权限。具体为:
      • 0表示前缀,表示八进制数;
      • 6表示文件所有者具有读写权限;
      • 0表示其他用户没有任何权限。
    • nil:Bolt数据库的配置选项,可以设置为nil,表示使用默认配置选项。如果需要自定义配置选项,可以使用bolt.Options类型的变量来设置。

3、建桶(表)

桶(Bucket)类似于关系数据库中的表(table)。一个桶里存放若干个key-value对,也就是关系数据库中的元组(tuple)。建桶的方法如下:

err = db.Update(func(tx *bolt.Tx) error {
    b, err := tx.CreateBucketIfNotExists([]byte("BlockBucket")) // 桶的名称必须为[]byte
    if err != nil {
        log.Panic(err)
        // return fmt.Errorf("create bucket: %v", err)
    }
    return nil
})

注释:

  • db.Update(func(tx *bolt.Tx) error {...}) 表示一个读写事务,任何增、删、改操作都必须写在里面。
  • db.View(func(tx *bolt.Tx) error {...}) 表示一个只读事务,任何读操作都必须写在里面。
  • tx.CreateBucketIfNotExists 用于新建一个表
  • 桶的相关名称,如桶名称、Key-value等,全部都必须转换为[]byte格式存储,读出的时候再转换回string或其他类型。

4、添加数据

数据以KV的形式存储于各个桶中。添加数据的方法如下:

err = db.Update(func(tx *bolt Tx) error {
    // 先获取表 BlockBucket
    b := tx.Bucket([]byte("BlockBucket"))
    // 再往表里面存储数据
    if b != nil {
        err := b.Put([]byte("001"), []byte("alias"))
        if err != nil {
            log.Panic("数据操作失败")
        }
    }
    return nil
})

注释:

  • 添加数据的步骤:先通过tx.Bucket获取表,再使用b.Put添加数据。前者是必要的,因为只有获取到表b才能调用其Put函数。
  • b.Put函数传入两个参数:代存储的Key和value,都转换为[]byte格式。

5、检索数据

使用下面的代码检索已经存储在表中的数据:

err = db.View(func(tx *bolt.Tx) error {
    // 获取BlockBucket表对象
    b := tx.Bucket([]byte("BlockBucket"))
    // 从表中读取数据
    if b != nil {
        data := b.Get([]byte("001"))
        fmt.Printf("%s\n", string(data))
    }
    return nil
})

注释:

  • 检索数据的步骤:同样地,先获取表b,再使用b.Get方法:传入检索的Key,返回对应的Value

  • 输出需要进行类型转换。

6、删除数据

将4中的

err := b.Put([]byte("001"), []byte("alias"))

改为Delete方法:

err := b.Delete([]byte("001"))

即可删除Key='001’的数据条目。

7、修改数据

和Put方法的使用完全一致。由于同一个表中,一个Key只能对应一个唯一的Value,因此我们只需要使用Put覆盖掉原数据即可。例如:

err = db.Update(func(tx *bolt Tx) error {
    // 先获取表 BlockBucket
    b := tx.Bucket([]byte("BlockBucket"))
    // 再往表里面存储数据
    if b != nil {
        // 添加数据
        err := b.Put([]byte("001"), []byte("alias"))
        if err != nil {
            log.Panic("数据添加失败")
        }
        // 修改数据
        err = b.Put([]byte("001"), []byte("Flias"))
        if err != nil {
            log.Panic("数据修改失败")
        }
    }
    return nil
})

此时,表BlockBucket中Key='001'的数据就会被修改。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。