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

  • 相关阅读:
    element ui 表单清空
    element ui 覆盖样式 方法
    element ui 修改表单值 提交无效
    element ui 抽屉里的表单输入框无法修改值
    element ui 抽屉首次显示 闪烁
    css 左侧高度 跟随右侧内容高度 自适应
    PICNUF框架
    elementui 抽屉组件标题 出现黑色边框
    vue 子组件跨多层调用父组件中方法
    vue 编辑table 数据 未点击提交,table里的数据就发生了改变(深拷贝处理)
  • 原文地址:https://www.cnblogs.com/rongfengliang/p/14132654.html
Copyright © 2011-2022 走看看