
最近学着做 golang 编写区块链系统,用到了 bolt 这个纯 golang 语言的简易数据库 bolt。字节数组作为基本数据类型以键值对形式保存数据。今天就通过一些简单示例来演示如何使用 bolt 数据库
- 创建数据库
- 创建 bucket
- 更新和查找数据
个人对 bolt 还算连接,也是刚刚接触,所以就是现学现分享,开始使用这个 bolt 数据库,先简单了解一些 bolt 存储数据的结构,在数据库中有多个 bucket,通过 bucket 将数据库进行划分为一个一个存储数据区域,然后我们在每一个块 bucket 中以键值对形式存储数据。
package main
import (
"fmt"
"log"
"github.com/boltdb/bolt"
)
要使用 bolt 我们需要下载并安装 github.com/boltdb/bolt
,go 没有很好包管理工具这一点与rust相比还是逊色不少。希望 golang 早日有好的包管理工具,javascript 成功归功于 npm。
func createDB() {
db, err := bolt.Open("my.db", 0600, nil)
if err != nil {
log.Fatal(err)
}
defer db.Close()
}
- Open 方法接收 3 参数、分别是,第一个参数是数据库名称(my.db), 第二个参数为文件操作权限,第三个参数是可选参数。Open 方法会返回一个两个对象,分别是数据库和一个错误对象,这是 golang 方法返回值的常规套路。使用完我们还需要关闭数据库,这里使用 defer 这个也是 golang 语言的特点。
插入数据方法
boltdb的读写事务操作我们可以使用DB.Update()来完成
func insertRecord(k string, v string) {
db, err := bolt.Open("my.db", 0600, nil)
defer db.Close()
if err != nil {
log.Fatal(err)
}
db.Update(func(tx *bolt.Tx) error {
b, err := tx.CreateBucket([]byte("mbucket"))
if err != nil {
return fmt.Errorf("create bucket: %s", err)
}
err = b.Put([]byte(k), []byte(v))
return nil
})
}
在 bolt 插入和更新数据都用 Update 接收一个闭包,通过闭包可以获得事务对象,调用事务对象 tx 的 CreateBucket 方法来创建一个 bucket。我们调用返回的 bucket 的对象 Put 方法便可以插入数据,插入键值对的键和值都是字节数组类型。
搜索数据
func searchRecordByKey(k string) {
db, err := bolt.Open("my.db", 0600, nil)
defer db.Close()
if err != nil {
log.Fatal(err)
}
db.View(func(tx *bolt.Tx) error {
b := tx.Bucket([]byte("mbucket"))
v := b.Get([]byte(k))
fmt.Printf("The answer is: %s\n", v)
return nil
})
}
- View 方法和 Update 方法使用类似,在闭包中也可以得到 tx 事务对象,然后调用其 Get 方法我们便可以根据键进行查找数据。
func main() {
// insertRecord("1", "hello")
searchRecordByKey("1")
}
网友评论