BoltDB数据库应用
undefinedBoltDB数据库使用简明指南
undefined1、项目中引用第三方库
import ("github.com/boltdb/bolt" // 从环境变量:%goPath% 中定义的路径去查找第三方类库)
undefined2、数据库打开或创建
db, err := bolt.Open("blockchain.db", 0600, nil)//0600:如果数据库不存在,则自动创建一个if err != nil {log.Panic(err)}defer db.Close()
注意,bolt会给打开的数据库文件加锁,确保一个数据库文件只会同时被打开一次。如果另外一个进程试图打开它,操作将会挂起,直到该数据库被关闭。
只读模式,参数为0666。
undefined3、更新数据库(插入或修改)
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)}}//一定要返回nilreturn nil})//更新数据库失败if err != nil {log.Panic(err)}
bolt使用事务(transaction)操作表,在同一时间只允许一个读-写事务执行,但同时可以允许有多个只读事务执行。
undefined4、根据键值查询数据
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)}//一定要返回nilreturn nil})//查询数据库失败if err != nil {log.Panic(err)}
bolt使用读事务来查询数据。
undefined5、光标操作
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
undefined6、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})
undefined7、其它操作
bolt还有批量更新操作、统计、备份操作的API,参见官方文档:
https://github.com/boltdb/bolt#opening-a-database
另外,bolt支持在Android、IOS平台上进行原生态开发
