zoukankan      html  css  js  c++  java
  • 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("
    
    Scanning through memdb: (%v)
    
    ", 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

  • 相关阅读:
    初步使用redis
    redis配置文件介绍
    windows64位 redis安装 步骤
    敏感词过滤算法
    SpringBoot使用拦截器无效
    linux常用命令
    automation(一)
    JAVA的接口多态
    JAVA的多态(强制转换)
    JAVA的多态
  • 原文地址:https://www.cnblogs.com/rongfengliang/p/14132654.html
Copyright © 2011-2022 走看看