Go之BoltDB数据库使用

简介

bolt是一个纯go语言实现的键值数据库,支持完全的ACID实务操作,尽管不像SQLite那样有完善的查询语言,但是接口简单易用。bolt本身通过使用一个内存映射的磁盘文件来管理数据,逻辑清晰,接口简单易用。

BoltDB设计源于LMDB,具有以下特点:

  • 使用Go语言编写

  • 不需要服务器即可运行

  • 支持数据结构

  • 直接使用API存取数据,没有查询语句;

  • 支持完全可序列化的ACID事务,这个特性比LevelDB强;

  • 数据保存在内存映射的文件里。没有wal、线程压缩和垃圾回收;

  • 通过COW技术,可实现无锁的读写并发,但是无法实现无锁的写写并发,这就注定了读性能超高,但写性能一般,适合与读多写少的场景。

BoltDB是一个Key/Value(键/值)存储,这意味着没有像SQL RDBMS(MySQL,PostgreSQL等)中的表,没有行,没有列。相反,数据作为键值对存储(如在Golang Maps中)。键值对存储在Buckets中,它们旨在对相似的对进行分组(这与RDBMS中的表类似)。因此,为了获得Value(值),需要知道该Value所在的桶和钥匙。

在这里插入图片描述

安装

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

代码中导入第三方包

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

简单使用

1.打开或创建数据库

//1.数据库创建
    //在这里gland直接运行,生成的my.db在main.go上层目录;命令行build在运行的话是当前目录!!!
    db, err := bolt.Open("chaorsBlock.db", 0600, nil)
    if err != nil {
    
    
        log.Fatal(err)
    }
    defer db.Close()

2.数据库操作

创建数据库表

//2.创建表
    err = db.Update(func(tx *bolt.Tx) error {
    
    
  
                //判断要创建的表是否存在
        b := tx.Bucket([]byte("MyBlocks"))
        if b == nil {
    
    
  
                //创建叫"MyBucket"的表
            _, err := tx.CreateBucket([]byte("MyBlocks"))
            if err != nil {
    
    
                                //也可以在这里对表做插入操作
                log.Fatal(err)
            }
        }

        //一定要返回nil
        return nil
    })

    //更新数据库失败
    if err != nil {
    
    
        log.Fatal(err)
    }

写入更新数据

//3.更新表数据
    err = db.Update(func(tx *bolt.Tx) error {
    
    

        //取出叫"MyBucket"的表
        b := tx.Bucket([]byte("MyBlocks"))

        //往表里面存储数据
        if b != nil {
    
    
                        //插入的键值对数据类型必须是字节数组
            err := b.Put([]byte("l"), []byte("0x0000"))
            err := b.Put([]byte("ll"), []byte("0x0001"))
                        err := b.Put([]byte("lll"), []byte("0x0002"))
            if err != nil {
    
    
                log.Fatal(err)
            }
        }

        //一定要返回nil
        return nil
    })

    //更新数据库失败
    if err != nil {
    
    
        log.Fatal(err)
    }

读取查询数据

//4.查看表数据
    err = db.View(func(tx *bolt.Tx) error {
    
    

        //取出叫"MyBucket"的表
        b := tx.Bucket([]byte("MyBlocks"))

        //往表里面存储数据
        if b != nil {
    
    

            data := b.Get([]byte("l"))
            fmt.Printf("%s\n", data)
            data := b.Get([]byte("l"))
            fmt.Printf("%s\n", data)
        }

        //一定要返回nil
        return nil
    })

    //查询数据库失败
    if err != nil {
    
    
        log.Fatal(err)
    }

猜你喜欢

转载自blog.csdn.net/qq_45066628/article/details/128616141