加入boltdb

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
package db

import (

	"github.com/asdine/storm"
	bolt "go.etcd.io/bbolt"
	"qrcodeTransferBox/config"
	"time"
)

var (
	Db *storm.DB
)

func InitDB() (*storm.DB,error) {
	d,_ := time.ParseDuration(config.Cfg.Db.Timeout)
	return storm.Open(config.Cfg.Db.DbPath, storm.BoltOptions(0600, &bolt.Options{Timeout: d}))
}

这里用的是storm这个库, 看起来好像调用方式更"容易看懂"点, 先用着看看. 另外这个库调用的是 go.etcd.io/bbolt这个版本

然后main.go里初始化一下

1
2
3
4
5
var err error
db.Db, err =  db.InitDB()
if err != nil {
  panic(err)
}  

写了一个AccessLog, 测试一下写日志进去

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
package utils

import (
	"github.com/gin-gonic/gin"
	"qrcodeTransferBox/db"
	"qrcodeTransferBox/model"
	"time"
)

func WriteAccessLog(c *gin.Context) {
	log := model.AccessLog{
		DateTime:time.Now(),
		Path:c.Request.RequestURI,
		Action:c.Request.Method,
	}
	_ = db.Db.Save(&log)
}

后面考虑情况, 弄成middleware的方式

测试了之后, 看一下数据, 发现qr.db已经生成, 找了个https://github.com/br0xen/boltbrowser工具来查看一下数据(这个工具的预编译下载地址的服务器很慢, 要上代理才行)


找了一下对于Db这种全局可能只需要一个实例的情况要如何在golang里处理, 大致有两个

  • 一次初始化, 全局调用, 引用一下就行
  • 写到context里
  • 如果是orm的话, 把db放到model里去

不过第二种, 在用的时候还要写几行代码取到实例才行, 还要处理下错误, 算了算了惹不起