error: no such function: json_extract

在尾道貓之細道遇到在板凳睡覺的貓
在 尾道-貓之細道 遇到在板凳睡覺的貓

在某專案遇到了 Database Query 時,要根據某欄位所儲存 JSON 的特定值做排序的狀況。 使用的資料庫是 SQLite,所以該欄位實際上是 TEXT 類型,需要先用 json_extract 函式來取 JSON 的特定值。 JSON 格式跟 SQL 語法類似:

{
  "birthday": {
    "year": 1989,
    "month": 11,
    "day": 21
  }
}
SELECT * FROM user ORDER BY json_extract(user.profile, '$.birthday.year') DESC
-- profile 實際上是 TEXT 類型的欄位

DB4S 執行 SQL 測試起來沒問題之後就開始進行對應 API 的開發。專案是以 Golang 開發,ORM 使用 xorm (底層 Driver 為 go-sqlite3)。

然而在開發過程中卻遇到了錯誤:

error:  no such function: json_extract

請教估狗大神之後得知 json_extract, json_each 這些函式是來自 SQLite 的 loadable extension JSON1 Extension,而在 go-sqlite3 的預設是沒有導入這個功能。所以要加入 JSON1 Extension 或其他 extension,在 build 階段要額外加上 tag:

go build --tags "json1"

go-sqlite3 重新 build 後就會包含對應的 extension 功能。

更多 go-sqlite3 支援的 additional extensions 可以看他們的 Wiki Page

© 2019 Hau Chen