araddon/qlbridge 整合go-memdb
阿新 • • 發佈:2020-12-14
使用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