JSON1 поддерживает go-sqlite3 с использованием gorm

В следующем примере я использую 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)

}

Проблема в том, что я не могу активировать модуль JSON1 при восстановлении go-sqlite3Водитель. Это будет ошибкаundefined function: json_extract на db.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: go version go1.13.1 linux/amd64 (платформа: Kubuntu 18.04)

версия go-sqlite3: github.com/mattn/go-sqlite3 текущий мастер

версия gorm: github.com/jinzhu/gorm текущий мастер

1 ответ

Согласно с go-sqlite3's docs, любой из следующих флагов будет работать:

  • 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

Также отметим, что вы используете --flags в вашем go build командовать, но дать --tags вместо этого попробуйте.

Другие вопросы по тегам