助力软件开发企业降本增效 PHP / java源码系统,只需一次付费,代码终身使用! 广告
# 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平台上进行原生态开发