在某專案遇到了 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。