BoltDB数据库应用

undefinedBoltDB数据库使用简明指南

undefined1、项目中引用第三方库

  1. import (
  2. "github.com/boltdb/bolt" // 从环境变量:%goPath% 中定义的路径去查找第三方类库
  3. )

undefined2、数据库打开或创建

  1. db, err := bolt.Open("blockchain.db", 0600, nil)//0600:如果数据库不存在,则自动创建一个
  2. if err != nil {
  3. log.Panic(err)
  4. }
  5. defer db.Close()

注意,bolt会给打开的数据库文件加锁,确保一个数据库文件只会同时被打开一次。如果另外一个进程试图打开它,操作将会挂起,直到该数据库被关闭。

只读模式,参数为0666。

undefined3、更新数据库(插入或修改)

  1. err = db.Update(func(tx *bolt.Tx) error {
  2. //取出叫"blocks"的表
  3. b := tx.Bucket([]byte("blocks"))
  4. //往表里面存储数据
  5. if b != nil {
  6. //插入的键值对数据类型必须是字节数组
  7. err := b.Put([]byte("1"), []byte("0x0000"))
  8. err := b.Put([]byte("11"), []byte("0x0001"))
  9. err := b.Put([]byte("111"), []byte("0x0002"))
  10. if err != nil {
  11. log.Panic(err)
  12. }
  13. }
  14. //一定要返回nil
  15. return nil
  16. })
  17. //更新数据库失败
  18. if err != nil {
  19. log.Panic(err)
  20. }

bolt使用事务(transaction)操作表,在同一时间只允许一个读-写事务执行,但同时可以允许有多个只读事务执行。

undefined4、根据键值查询数据

  1. err = db.View(func(tx *bolt.Tx) error {
  2. //取出叫"blocks"的表
  3. b := tx.Bucket([]byte("blocks"))
  4. //根据键值读取数据
  5. if b != nil {
  6. data := b.Get([]byte("1"))
  7. fmt.Printf("%s\n", data)
  8. data := b.Get([]byte("11"))
  9. fmt.Printf("%s\n", data)
  10. }
  11. //一定要返回nil
  12. return nil
  13. })
  14. //查询数据库失败
  15. if err != nil {
  16. log.Panic(err)
  17. }

bolt使用读事务来查询数据。

undefined5、光标操作

  1. db.View(func(tx *bolt.Tx) error {
  2. // 假定 bucket 存在并且有键值
  3. b := tx.Bucket([]byte("MyBucket"))
  4. c := b.Cursor()
  5. for k, v := c.First(); k != nil; k, v = c.Next() {
  6. fmt.Printf("key=%s, value=%s\n", k, v)
  7. }
  8. return nil
  9. })

光标操作支持:First、Last、Seek、Next、Prev

undefined6、ForEach操作

  1. db.View(func(tx *bolt.Tx) error {
  2. // 假定 bucket 存在并且有键值
  3. b := tx.Bucket([]byte("blocks"))
  4. b.ForEach(func(k, v []byte) error {
  5. fmt.Printf("key=%s, value=%s\n", k, v)
  6. return nil
  7. })
  8. return nil
  9. })

undefined7、其它操作

bolt还有批量更新操作、统计、备份操作的API,参见官方文档:

https://github.com/boltdb/bolt#opening-a-database

另外,bolt支持在Android、IOS平台上进行原生态开发