如何编译go-sqlite3启用JSON1模块解决json_extract未定义错误
解决go-sqlite3启用JSON1模块编译失败的问题
你遇到的问题是因为go-sqlite3默认编译时没有启用JSON1扩展,而且之前用的编译参数格式不对——go-sqlite3是通过build tags来启用这类扩展的,不是-flags参数。下面是正确的解决步骤:
你的示例代码
这是你调用json_extract的测试代码:
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 build -a -flags "sqlite_json1" github.com/mattn/go-sqlite3go install -a -flags "sqlite_json1" github.com/mattn/go-sqlite3go build -a --flags "sqlite_json1" github.com/mattn/go-sqlite3go install -a --flags "sqlite_json1" github.com/mattn/go-sqlite3
正确的编译步骤
1. 清理本地缓存(避免旧版本干扰)
先清理Go的模块缓存和构建缓存,确保后续编译用的是最新配置:
go clean -cache -modcache
2. 安装启用JSON1的go-sqlite3驱动
使用-tags参数指定启用sqlite_json1扩展,执行安装命令:
go install -tags sqlite_json1 github.com/mattn/go-sqlite3
3. 构建你的项目时带上同样的tag
编译你自己的项目代码时,也需要加上-tags sqlite_json1,这样Go会链接启用了JSON1的sqlite3库:
go build -tags sqlite_json1 ./your-main-package-path
验证效果
完成上述步骤后,重新运行你的程序,json_extract函数就能正常执行,不会再出现undefined function的错误了。
内容的提问来源于stack exchange,提问作者riccardo_92
相关产品推荐
相关产品推荐

