做后端开发的数据库那是见得多了,像什么Mysql、SQL Server、Oracle、SQLite、MongoDB、Redis等都是一些比较主流的数据库(这里边有关系型和非关系型的数据库,这里不讨论这个),具体使用哪种根据需要来定。不过这些数据库都是比较大型的数据库了(这里指像Mysql、SQL Server、Oracle这些),需要专门的工具来识别db文件,而且携带一大堆组件等等(因为这些数据库本身就是一个软件了),实在是小不到哪里去。而这里要介绍的Bolt库它不是一个数据库,而是一个用来操作文件数据库的依赖库,通过它我们可以实现创阿金一个文件数据库的功能。不过实质上在创建的时候你会发现其实他存数据就只有一个db文件,别的没有,一切的数据存取操作都通过这个db文件来完成。
       由bolt构建的db文件是具有一定结构的,它会将一个db文件划分为若干个bucket(桶),这些bucket需要我们主动创建,就相当于磁盘分区(我们这里将db文件比作磁盘,db文件内创建的每个桶,我们比作分区),每个桶都有其自己的名字,方便我们找到桶。桶内以键值对的方式存储数据,当我们想要在某个桶内存取数据的时候,首先打开db文件,然后通过桶名找到指定桶,最后对桶进行存取操作。

db文件和bucket(桶)和kv(键值)对的关系如下图:

bolt安装:

go get github.com/boltdb/bolt/...

bolt使用:

bolt操作文件数据库除了打开db文件之外,剩下的无非就是读、写db文件了,代码如下:

package mainimport ("fmt""github.com/boltdb/bolt""log""os"
)func main(){if len(os.Args) == 1 {fmt.Println("命令为create则创建一个桶")fmt.Println("命令为set则在桶中添加一个键值对")fmt.Println("命令为backup则对该db文件做备份")os.Exit(1)}//打开db文件,如果不存在则创建,如果存在则打开,第一个参数表示db文件的路径,第二个参数表示操作方式,第三个参数表示配置信息,没有明确需要可以不配置,直接写nildb,err := bolt.Open("backupKStor.db",0666,nil)if err != nil {log.Fatal("db文件查找或创建失败,请稍后重试")}defer db.Close()switch os.Args[1] {case "create":db.Update(func(tx *bolt.Tx) error {//创建桶,参数为桶名_,err := tx.CreateBucket([]byte(os.Args[2]))/**如果桶不存在则创建桶,如果存在直接返回桶对象(推荐用这个方法)_,err := tx.CreateBucketIfNotExists([]byte(os.Args[2]))*///遍历桶,name为桶名,b为桶本身的对象tx.ForEach(func(name []byte, b *bolt.Bucket) error {fmt.Println(string(name))return err})return err})fmt.Println("创建桶成功")case "set"://以读写的方式开启事务db.Update(func(tx *bolt.Tx) error {//通过桶名获取桶对象,参数表示桶名b := tx.Bucket([]byte(os.Args[4]))//往桶中添加数据,第一个参数表示键,第二个参数表示值err := b.Put([]byte(os.Args[2]),[]byte(os.Args[3]))return err})fmt.Println("设置kv对成功")case "backup"://以只读的方式开启事务db.View(func(tx *bolt.Tx) error {//备份db文件,第一个参数path表示备份文件路径,第二个参数mode表示备份文件的操作方式,值参考Linux下文件的-rwxrwxrwx权限err := tx.CopyFile("backupKStor.db",0666)return err})fmt.Println("备份成功")case "foreachkv":db.View(func(tx *bolt.Tx) error {b := tx.Bucket([]byte(os.Args[2]))//遍历桶中的所有键值对b.ForEach(func(k, v []byte) error {fmt.Printf("k = %s,v = %s\n",string(k),string(v))return nil})return nil})fmt.Println("桶中所有键值对遍历成功")case "cursor":db.View(func(tx *bolt.Tx) error {b := tx.Bucket([]byte(os.Args[3]))var k []bytevar v []byte//获取桶内的指针,这个指针并非数据类型的指针,而是指类似于可以上下移动的游标,指向当前的某个k-v对c := b.Cursor()switch os.Args[2]{case "first"://指针指向第一个k-v对k,v = c.First()case "last"://指针指向最后个k-v对k,v = c.Last()case "seek"://指针指向指定位置的k-v对,参数是你所指定的某个kv对的键k,v = c.Seek([]byte(os.Args[4]))case "next"://在指定上/下一个这种相对位置的时候需要先设置cursor指针的位置,否则程序不知道你相对谁移动到上/下一个,下同c.Seek([]byte(os.Args[4]))//指针指向下一个k-v对k,v = c.Next()case "prev":c.Seek([]byte(os.Args[4]))//指针指向前一个k-v对k,v = c.Prev()}fmt.Printf("k = %s,v = %s\n",string(k),string(v))return nil})case "prefix"://前缀扫描db.View(func(tx *bolt.Tx) error {b := tx.Bucket([]byte(os.Args[3]))c := b.Cursor()//定义一个前缀,假设是“n”开头的前缀,name,nick都满足条件prefix := []byte(os.Args[2])//Seek的参数可以是完整的key,也可以是key的前缀,都能找出来//bytes.HasPrefix函数是判断第一个参数是否以第二个参数作为前缀for k,v := c.Seek(prefix);bytes.HasPrefix(k,prefix);k,v = c.Next(){fmt.Printf("k = %s,v = %s\n",string(k),string(v))}return nil})}
}

代码中很多地方都用到了os.Args这个字符串切片,这个不用在意,因为我在运行这个代码的可执行文件的时候通过后面携带参数的方式运行的,这样方便我测试代码的功能。

Golang之文件数据库--Bolt库的使用相关推荐

  1. 【golang】轻量级的单文件数据库

    背景 有的时候,我们并不需要用到大型的数据库:如mysql.oracledb.postgresql等,然而,直接使用json文件保存信息,又有点不太方便,所以需要用到一些轻量级的单文件数据库. 比如以 ...

  2. Golang使用pkg-config自动获取头文件和链接库的方法

    为了能够重用已有的C语言库,我们在使用Golang开发项目或系统的时候难免会遇到Go和C语言混合编程,这时很多人都会选择使用cgo. 话说cgo这个东西可算得上是让人又爱又恨,好处在于它可以让你快速重 ...

  3. golang github.com/go-sql-driver/mysql 遇到的数据库,设置库设计不合理的解决方法

    golang github.com/go-sql-driver/mysql 遇到的数据库,设置库设计不合理的解决方法,查询中报了以下这个错 Scan error on column index 2: ...

  4. golang优秀开源框架和库

    作者:承诺一时的美丽 链接:https://www.jianshu.com/u/6719426bf97e 來源:简书 音频和音乐 用于操纵音频的库. flac - Native Go FLAC解码器. ...

  5. 64位oracle客户端_开发小记-golang连接Oracle数据库配置

    项目需求golang连接Orale数据库,使用mattn/go-oci8包,github地址 https://github.com/mattn/go-oci8 过程 Oracle Client和SDK ...

  6. java 轻量级文件数据库_Java:如何创建轻量级数据库微服务

    java 轻量级文件数据库 基于云的Java数据库应用程序的数量每分钟都在增加. 许多组织部署了数百甚至数千个微服务实例. 但是,相对于运行时环境,大多数应用程序会带来惊人的不必要开销. 反过来,这会 ...

  7. mysql使用全备文件恢复单个库或者单个表

    这里写自定义目录标题 使用全备文件恢复单个库 sed -n '/^-- Current Database: `数据库名称`/,/^-- Current Database: `/p' 备份文件.sql ...

  8. oracle11g增加备库,oracle11g dataguard物理备库搭建(关闭主库cp数据文件到备库)

    Dataguard 环境: 操作系统:Redhat6.4 Primary数据库: IP 地址:192.168.1.122 数据库SID:ora11g DB_UNIQUE_NAME:ora11g_pri ...

  9. mysql操作数据库的步骤,Golang操作MySql数据库的完整步骤记录

    前言 MySQL是业界常用的关系型数据库,在平时开发中会经常与MySql数据库打交道,所以在接下来将介绍怎么使用Go语言操作MySql数据库. 下载MySql连接驱动 Go语言中的database/s ...

最新文章

  1. Java学习笔记25
  2. 错误 2 error C2059: 语法错误:“::”
  3. antd Tree组件中,自定义右键菜单
  4. 构建根文件系统之启动第1个程序init
  5. Linux Kernel系列三:Kernel编译和链接中的linker script语法详解
  6. php变量的数据类型
  7. 58条模拟、数字电路基础知识总结
  8. 关于在ElasticSearch中使用now函数进行时间范围过滤查询的问题
  9. 【Java开源项目】消息推送平台发送一条短信
  10. 【小家java】Java中主线程(父线程)与子线程的通信和联系
  11. Openlayers之地图比例尺控件
  12. 大学生创新创业项目管理系统
  13. Java和C++基本类型与语法的区别
  14. 录制电脑桌面的gif图工具 GifCam
  15. 【软件工程】软件工程知识点汇总(超详细)
  16. C/C++函数传递二维数组
  17. 摸鱼也有效率——8个python自动化脚本提高打工人幸福感~
  18. php重力传感器,HTML5中如何调用手机重力感应的接口
  19. 互联网运营打造个人微博之道
  20. NOIP模拟(10.22)T2 杆子的排列

热门文章

  1. 【步进电机与Arduino使用教程】
  2. 微软发布补丁封杀允许Surface RT安装Linux的“漏洞”
  3. 与App Store审核的斗智斗勇
  4. 计算机三级网络技术第四章(第一轮)
  5. Pythonshellcode编码+混淆免杀
  6. CyberLink PowerDVD 6.0 汉化豪华版
  7. 课堂随机提问中奖生成器二
  8. 可视化股票逐笔数据分析工具分享
  9. 关于使用多普达windows mobile 手机使用联通卡不能上网的问题
  10. SQL固定长度字符和可变长度字符