SQLite 编译时如何开启 JSON1 扩展模块支持

文章导读
如果你的 SQLite 版本较新(3.9.0 以后),很多发行版默认已经开启了 JSON1 支持,无需重新编译;只有在确认当前环境缺失该功能且无法通过加载扩展文件解决时,才需要下载源码并添加编译参数重新构建。
📋 目录
  1. A 命令速用版
  2. B 为什么会这样
  3. C 分步处理
  4. D 怎么验证是否生效
  5. E 常见坑
  6. F 参考来源
A A

如果你的 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 扩展虽然代码包含在源码树中,但默认处于禁用状态,需要显式指定预编译宏才能生成相关函数。

SQLite 编译时如何开启 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 并加载该文件。

SQLite 编译时如何开启 JSON1 扩展模块支持

怎么验证是否生效

执行 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 博客