如果你的 SQLite 版本较新(3.9.0 以后),很多发行版默认已经开启了 JSON1 支持,无需重新编译;只有在确认当前环境缺失该功能且无法通过加载扩展文件解决时,才需要下载源码并添加编译参数重新构建。
先说结论:优先检查现有环境是否已支持,确需编译时需在 CFLAGS 中加入 -DSQLITE_ENABLE_JSON1=1 参数。
- 适合:嵌入式环境、自定义 Python/Go 驱动编译、或官方二进制包缺失 JSON 功能的场景
- 先准备:确认当前 SQLite 版本及编译选项,下载对应版本的源码 amalgamation
- 验收:通过 SQL 查询 json_type 函数确认扩展是否可用
命令速用版
先检查当前数据库是否已支持 JSON 功能,执行以下 SQL:
SELECT json_type('[1,2,3]');
若报错说明未启用。编译时核心参数如下:
export CFLAGS="-DSQLITE_ENABLE_JSON1=1 -DSQLITE_ENABLE_FTS5=1 ..."
./configure `--prefix`=/your/install/path
make && make install
为什么会这样
SQLite 的源码 amalgamation 为了保持轻量化和默认安全性,编译时通常不会开启所有扩展模块。JSON1 扩展虽然代码包含在源码树中,但默认处于禁用状态,需要显式指定预编译宏才能生成相关函数。
分步处理
1. 检查编译选项:在 Python 或 SQLite 命令行中执行 PRAGMA compile_options;,查看输出中是否有 ENABLE_JSON1。
2. 下载源码:访问 SQLite 官方下载页获取与当前版本一致的源码包,或者使用 fossil 克隆仓库。
3. 配置编译环境:解压源码后,在终端设置环境变量,务必包含 -DSQLITE_ENABLE_JSON1=1。
4. 编译与安装:执行标准的 configure 和 make 流程,若只需动态扩展库,可单独编译 json1.c 生成共享库文件。
5. 加载扩展(可选):若不想重新编译主程序,可编译生成 json1.dll 或 libjson.so,然后在代码中启用 load_extension 并加载该文件。
怎么验证是否生效
执行 SQL 查询 SELECT json_type('["a", "b", 1]');,若返回结果 array 则代表加载成功。若在 Python 中,确保连接对象调用了 enable_load_extension(True) 后再加载扩展文件。
常见坑
1. 版本不一致:编译扩展用的源码版本必须与正在运行的 SQLite 库版本严格一致,否则可能导致段错误。
2. 加载权限:使用 load_extension 需要数据库连接开启允许加载扩展的选项,部分环境出于安全考虑默认禁止。
3. 路径问题:加载动态库时需指定正确的相对或绝对路径,Windows 下生成 dll,Linux 下生成 so 文件。
参考来源
- 如何在 python 的 sqlite3 里启用 json1 插件 - 哔哩哔哩
- 图灵社区 - SQLite 3.9.0 版本升级说明
- The JSON1 Extension - SQLite 官方文档
- 抽取 ROS 中的未知消息内容以及 Sqlite3 使用 JSON1 扩展的方法以及示例--命令行模式_sqlite3 命令行 json-CSDN 博客