能否在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
相关产品推荐
相关产品推荐

