1. 程式人生 > 實用技巧 >araddon/qlbridge 整合go-memdb

araddon/qlbridge 整合go-memdb

使用araddon/qlbridge 我們可以開發一個通用的sql 引擎,go-memdb 是hashicorp 公司開發的
一個基於記憶體的支援事務的db,araddon/qlbridge 官方已經支援了go-memdb,以下是一個簡單
的試用

環境準備

  • go.mod
module demoapp
go 1.15
require (
  github.com/araddon/dateparse v0.0.0-20190622164848-0fb0a474d195
  github.com/araddon/gou v0.0.0-20190110011759-c797efecbb61
  github.com/araddon/qlbridge v0.0.0-20200708000952-ce9ad213e74c // indirect
)
  • main.go
package main
import (
  "database/sql"
  "database/sql/driver"
  "flag"
  "fmt"
  "log"
  "strings"
  "github.com/araddon/qlbridge/datasource/memdb"
  _ "github.com/araddon/qlbridge/qlbdriver"
  "github.com/araddon/qlbridge/schema"
  u "github.com/araddon/gou"
  "github.com/araddon/qlbridge/expr/builtins"
)
var (
  logging = "info"
)
func init() {
  flag.StringVar(&logging, "logging", "info", "logging [ debug,info ]")
  flag.Parse()
  u.SetupLogging(logging)
  u.SetColorOutput()
}
func main() {
  builtins.LoadAllBuiltins()
  inrow := []driver.Value{"dalong", 2222, "v2"}
  inrow2 := []driver.Value{"dalong1", 2222, "v2"}
  memdb, err := memdb.NewMemDbData("demoapp", [][]driver.Value{inrow, inrow2}, []string{"name", "age", "version"})
  if err != nil {
    log.Fatalln("memdb error", err.Error())
   }
  schema.RegisterSourceAsSchema("demoapp", memdb)
  db, err := sql.Open("qlbridge", "demoapp")
  if err != nil {
    panic(err.Error())
   }
  defer db.Close()
  // some insert ops
  _, err = db.Exec(`insert into demoapp(name,age,version) values('dalongdemo',333,'v3'))`)
  if err != nil {
    log.Fatalln("insert errpr")
   }
  // query
  rows, err := db.Query("select name,age,version,now() as now from demoapp")
  if err != nil {
    u.Errorf("could not execute query: %v", err)
    return
   }
  defer rows.Close()
  cols, _ := rows.Columns()
  readCols := make([]interface{}, len(cols))
  writeCols := make([]string, len(cols))
  for i := range writeCols {
    readCols[i] = &writeCols[i]
   }
  fmt.Printf("\n\nScanning through memdb: (%v)\n\n", strings.Join(cols, ","))
  for rows.Next() {
    rows.Scan(readCols...)
    fmt.Println(strings.Join(writeCols, ", "))
   }
  fmt.Println("")
}
  • 程式碼說明
    因為qlbridge已經包裝好了一個memdb 的schema source,我們需要的操作是直接初始話,同時定義schema
    memdb datasource 的初始化大致有三種方法:包含資料,不包含資料,以及支援索引的,我們初始化memdb
    只會就可以使用sql 進行memdb的操作了,可以進行insert select 同時可以使用自定義的表示式,以上程式碼就包含了
    一個簡單的insert 以及select 操作

執行&&效果

  • 執行
go run cmd/memdb/main.go
  • 效果

說明

目前測試araddon/qlbridge 有一點是對於* 模式的支援不太好,所以寫編寫sql 的時候需要指定明確的列

參考資料

https://github.com/araddon/qlbridge
https://github.com/rongfengliang/qlbridge-learning
https://github.com/hashicorp/go-memdb