# BoltDB数据库使用简明指南
## 1、项目中引用第三方库
~~~
import (
"github.com/boltdb/bolt" // 从环境变量:%goPath% 中定义的路径去查找第三方类库
)
~~~
## 2、数据库打开或创建
~~~
db, err := bolt.Open("blockchain.db", 0600, nil)//0600:如果数据库不存在,则自动创建一个
if err != nil {
log.Panic(err)
}
defer db.Close()
~~~
注意,bolt会给打开的数据库文件加锁,确保一个数据库文件只会同时被打开一次。如果另外一个进程试图打开它,操作将会挂起,直到该数据库被关闭。
只读模式,参数为0666。
## 3、更新数据库(插入或修改)
~~~
err = db.Update(func(tx *bolt.Tx) error {
//取出叫"blocks"的表
b := tx.Bucket([]byte("blocks"))
//往表里面存储数据
if b != nil {
//插入的键值对数据类型必须是字节数组
err := b.Put([]byte("1"), []byte("0x0000"))
err := b.Put([]byte("11"), []byte("0x0001"))
err := b.Put([]byte("111"), []byte("0x0002"))
if err != nil {
log.Panic(err)
}
}
//一定要返回nil
return nil
})
//更新数据库失败
if err != nil {
log.Panic(err)
}
~~~
bolt使用事务(transaction)操作表,在同一时间只允许一个读-写事务执行,但同时可以允许有多个只读事务执行。
## 4、根据键值查询数据
~~~
err = db.View(func(tx *bolt.Tx) error {
//取出叫"blocks"的表
b := tx.Bucket([]byte("blocks"))
//根据键值读取数据
if b != nil {
data := b.Get([]byte("1"))
fmt.Printf("%s\n", data)
data := b.Get([]byte("11"))
fmt.Printf("%s\n", data)
}
//一定要返回nil
return nil
})
//查询数据库失败
if err != nil {
log.Panic(err)
}
~~~
bolt使用读事务来查询数据。
## 5、光标操作
~~~
db.View(func(tx *bolt.Tx) error {
// 假定 bucket 存在并且有键值
b := tx.Bucket([]byte("MyBucket"))
c := b.Cursor()
for k, v := c.First(); k != nil; k, v = c.Next() {
fmt.Printf("key=%s, value=%s\n", k, v)
}
return nil
})
~~~
光标操作支持:First、Last、Seek、Next、Prev
## 6、ForEach操作
~~~
db.View(func(tx *bolt.Tx) error {
// 假定 bucket 存在并且有键值
b := tx.Bucket([]byte("blocks"))
b.ForEach(func(k, v []byte) error {
fmt.Printf("key=%s, value=%s\n", k, v)
return nil
})
return nil
})
~~~
## 7、其它操作
bolt还有批量更新操作、统计、备份操作的API,参见官方文档:
[https://github.com/boltdb/bolt#opening-a-database](https://github.com/boltdb/bolt#opening-a-database)
另外,bolt支持在Android、IOS平台上进行原生态开发
- 重要更新说明
- linechain发布
- linechain新版设计
- 引言一
- 引言二
- 引言三
- vs-code设置及开发环境设置
- BoltDB数据库应用
- 关于Go语言、VS-code的一些Tips
- 区块链的架构
- 网络通信与区块链
- 单元测试
- 比特币脚本语言
- 关于区块链的一些概念
- 区块链组件
- 区块链第一版:基本原型
- 区块链第二版:增加工作量证明
- 区块链第三版:持久化
- 区块链第四版:交易
- 区块链第五版:实现钱包
- 区块链第六版:实现UTXO集
- 区块链第七版:网络
- 阶段小结
- 区块链第八版:P2P
- P2P网络架构
- 区块链网络层
- P2P区块链最简体验
- libp2p建立P2P网络的关键概念
- 区块链结构层设计与实现
- 用户交互层设计与实现
- 网络层设计与实现
- 建立节点发现机制
- 向区块链网络请求区块信息
- 向区块链网络发布消息
- 运行区块链
- LineChain
- 系统运行流程
- Multihash
- 区块链网络的节点发现机制深入探讨
- DHT
- Bootstrap
- 连接到所有引导节点
- Advertise
- 搜索其它peers
- 连接到搜到的其它peers
- 区块链网络的消息订发布-订阅机制深入探讨
- LineChain:适用于智能合约编程的脚本语言支持
- LineChain:解决分叉问题
- LineChain:多重签名
- libp2p升级到v0.22版本
- 以太坊基础
- 重温以太坊的树结构
- 世界状态树
- (智能合约)账户存储树
- 交易树
- 交易收据树
- 小结
- 以太坊的存储结构
- 以太坊状态数据库
- MPT
- 以太坊POW共识算法
- 智能合约存储
- Polygon Edge
- block结构
- transaction数据结构
- 数据结构小结
- 关于本区块链的一些说明
- UML工具-PlantUML
- libp2p介绍
- JSON-RPC
- docker制作:启动多个应用系统
- Dockerfile
- docker-entrypoint.sh
- supervisord.conf
- docker run
- nginx.conf
- docker基础操作整理
- jupyter计算交互环境
- git技巧一
- git技巧二
- 使用github项目的最佳实践
- windows下package管理工具