0

在以下示例中,我使用了Golang 中的驱动程序json_extract(...)go-sqlite3

package main

import (
    _ "github.com/mattn/go-sqlite3"
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/sqlite"
    "fmt"
    "encoding/json"
    "net/http"
)

func main() {

    var db *gorm.DB

    type Session struct {
        gorm.Model
        SessionID string `json:"session_id"`
        Options string `json:"options"`
    }

    db, err := gorm.Open("sqlite3", "./app.db")
    if err != nil {
        fmt.Println(err)
    }

    defer db.Close() 
    db.AutoMigrate(&Session{})

    var m map[string]int
    m = make(map[string]int)
    m["a"] = 1
    m["b"] = 2
    m["c"] = 3

    js, err := json.Marshal(m)

    sess := Session{
        SessionID: "test",
        Options: string(js),
    }

    db.Create(&sess)
    db.Save(&sess)

    var b = &Session{}

    type Result struct {
        Options string
    }

    // JSON test
    var res Result
    db.Raw("SELECT json_extract(options, '$.a') as Options from sessions").Scan(&res)

    fmt.Println(sess.ID)
    fmt.Println(res)

}

问题是我无法在重建go-sqlite3驱动程序时激活 JSON1 模块。就会出错undefined function: json_extractdb.Raw(...)行了。

无论如何,我知道对于 JSON 支持,github.com/mattn/go-sqlite3必须使用-flags "sqlite_json1". 我尝试了几种变体:

go build -a -flags "sqlite_json1"  github.com/mattn/go-sqlite3
go install -a -flags "sqlite_json1"  github.com/mattn/go-sqlite3
go build -a --flags "sqlite_json1"  github.com/mattn/go-sqlite3
go install -a --flags "sqlite_json1"  github.com/mattn/go-sqlite3

以及更多变体flags,例如sqlite_json, json,json1等。没有什么可以摆脱未定义的函数错误。任何想法如何正确重建go-sqlite3

显然,在那之后我也重建了自己的代码。


一些信息:

去版本:(go version go1.13.1 linux/amd64平台:Kubuntu 18.04)

go-sqlite3 版本:github.com/mattn/go-sqlite3 当前主

gorm 版本:github.com/jinzhu/gorm 当前大师

4

1 回答 1

0

根据go-sqlite3的文档,以下任何标志都可以使用:

  • sqlite_json
  • sqlite_json1
  • json1

这是sqlite3_opt.json1.go定义包含此文件的标签的内容。

// Copyright (C) 2014 Yasuhiro Matsumoto <mattn.jp@gmail.com>.
//
// Use of this source code is governed by an MIT-style
// license that can be found in the LICENSE file.

// +build sqlite_json sqlite_json1 json1

package sqlite3

/*
#cgo CFLAGS: -DSQLITE_ENABLE_JSON1
*/
import "C"

参考:https ://github.com/mattn/go-sqlite3/blob/master/sqlite3_opt_json1.go

另外要指出的是,您--flagsgo build命令中使用,但请--tags尝试一下。

于 2019-10-10T06:46:50.813 回答