如何通过DuckDB Node.js API直接加载JSON对象至数据表?
DuckDB Node.js 无需写入文件加载JSON对象的实现方法
当然可以无需写入文件直接加载JSON对象到DuckDB,以下是几种实用的实现方式:
方法一:参数绑定批量插入
适合数据量中等、结构明确的场景,安全性高(自动处理特殊字符转义):
const duckdb = require('duckdb'); const db = new duckdb.Database(':memory:'); // 待导入的JSON对象数组 const jsonData = [ { id: 1, name: 'Alice', age: 30 }, { id: 2, name: 'Bob', age: 25 } ]; // 1. 创建匹配结构的表 db.run('CREATE TABLE users (id INTEGER, name VARCHAR, age INTEGER)'); // 2. 准备预编译插入语句 const insertStmt = db.prepare('INSERT INTO users VALUES (?, ?, ?)'); // 3. 遍历JSON数据完成插入 jsonData.forEach(item => { insertStmt.run(item.id, item.name, item.age); }); // 验证结果 db.all('SELECT * FROM users', (err, rows) => { if (err) throw err; console.log(rows); });
方法二:通过VALUES语句构造表
适合小型数据集,写法简洁:
const duckdb = require('duckdb'); const db = new duckdb.Database(':memory:'); const jsonData = [ { id: 1, name: 'Alice', age: 30 }, { id: 2, name: 'Bob', age: 25 } ]; // 将JSON对象转为SQL VALUES格式的字符串,注意转义单引号 const rowsStr = jsonData.map(item => `(${item.id}, '${item.name.replace(/'/g, "''")}', ${item.age})` ).join(', '); // 直接创建表并导入数据 db.run(`CREATE TABLE users AS SELECT * FROM VALUES ${rowsStr} AS t(id, name, age)`); // 验证结果 db.all('SELECT * FROM users', (err, rows) => { if (err) throw err; console.log(rows); });
方法三:从内存Buffer导入JSON Lines数据
适合大数据量场景,利用DuckDB的COPY功能直接读取内存缓冲区:
const duckdb = require('duckdb'); const db = new duckdb.Database(':memory:'); const jsonData = [ { id: 1, name: 'Alice', age: 30 }, { id: 2, name: 'Bob', age: 25 } ]; // 将JSON数组转为JSON Lines格式(每行一个JSON对象) const jsonLines = jsonData.map(JSON.stringify).join('\n'); const dataBuffer = Buffer.from(jsonLines); // 1. 创建表 db.run('CREATE TABLE users (id INTEGER, name VARCHAR, age INTEGER)'); // 2. 注册内存缓冲区到DuckDB db.register_buffer('json_data_buf', dataBuffer); // 3. 从缓冲区导入数据 db.run(`COPY users FROM 'buffer://json_data_buf' (FORMAT JSON)`); // 验证结果 db.all('SELECT * FROM users', (err, rows) => { if (err) throw err; console.log(rows); });
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

