You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在better-sqlite3中使用SQLite的json_extract等JSON函数?

在better-sqlite3中使用SQLite JSON函数

可以,better-sqlite3默认支持SQLite的所有JSON函数(包括json_extract),它基于的SQLite版本已内置JSON扩展,无需额外配置或安装插件。以下是具体操作示例:

1. 创建含JSON字段的表

SQLite的JSON类型本质是TEXT的别名,你可以直接定义字段类型为JSON或TEXT:

CREATE TABLE users (
  id INTEGER PRIMARY KEY,
  info JSON -- 或使用 TEXT 类型
);

2. 插入JSON数据

可以通过JavaScript的JSON.stringify生成JSON字符串插入,也可以直接写入JSON格式的字符串:

const db = require('better-sqlite3')('test.db');

// 方式1:用JSON.stringify转换对象
db.prepare('INSERT INTO users (info) VALUES (?)')
  .run(JSON.stringify({ name: 'Alice', age: 30, hobbies: ['reading', 'hiking'] }));

// 方式2:直接写入JSON字符串
db.prepare('INSERT INTO users (info) VALUES (\'{"name": "Bob", "age": 25}\')').run();

3. 使用json_extract查询数据

json_extract的语法为json_extract(json_column, '$.路径'),支持提取对象属性、数组元素:

// 提取所有用户的name字段
const getNames = db.prepare('SELECT id, json_extract(info, \'$.name\') AS name FROM users');
console.log(getNames.all());
// 输出示例:[{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }]

// 提取Alice的第一个爱好
const getFirstHobby = db.prepare('SELECT json_extract(info, \'$.hobbies[0]\') AS first_hobby FROM users WHERE id = 1');
console.log(getFirstHobby.get());
// 输出示例:{ first_hobby: 'reading' }

4. 其他常用JSON函数示例

除了json_extract,还可以使用SQLite提供的其他JSON操作函数:

  • 更新JSON字段(json_set):
db.prepare('UPDATE users SET info = json_set(info, \'$.age\', 31) WHERE id = 1').run();
  • 获取数组长度(json_array_length):
const getHobbyCount = db.prepare('SELECT json_array_length(info, \'$.hobbies\') AS hobby_count FROM users WHERE id = 1');
console.log(getHobbyCount.get());
// 输出示例:{ hobby_count: 2 }

注意事项

如果遇到json_extract等函数不存在的情况,大概率是你的better-sqlite3版本过旧,升级到最新版本即可——better-sqlite3会捆绑当前最新的SQLite版本,确保JSON扩展可用。

内容的提问来源于stack exchange,提问作者Shaaa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 06:27:38