⌘+k ctrl+k
1.4 (LTS)
搜索快捷键 cmd + k | ctrl + k
Node.js API

DuckDB Node.js(已弃用)客户端的最新稳定版本是 1.4.4。DuckDB v1.5 将不再发布 Node.js 客户端。

已弃用 旧版 DuckDB Node.js 软件包已弃用。请改用 DuckDB Node Neo 软件包

duckdb 软件包为 DuckDB 提供了 Node.js API。该客户端的 API 在一定程度上兼容 SQLite Node.js 客户端,以便于迁移。

初始化

加载软件包并创建数据库对象

const duckdb = require('duckdb');
const db = new duckdb.Database(':memory:'); // or a file name for a persistent DB

数据库配置中描述的所有选项都可以(可选)作为第二个参数提供给 Database 构造函数。第三个参数可选择性提供,用于获取关于给定选项的反馈。

const db = new duckdb.Database(':memory:', {
    "access_mode": "READ_WRITE",
    "max_memory": "512MB",
    "threads": "4"
}, (err) => {
  if (err) {
    console.error(err);
  }
});

运行查询

以下代码片段使用 Database.all() 方法运行了一个简单的查询。

db.all('SELECT 42 AS fortytwo', function(err, res) {
  if (err) {
    console.warn(err);
    return;
  }
  console.log(res[0].fortytwo)
});

其他可用方法包括 each(对每一行调用回调函数)、run(执行单个无结果的语句)以及 exec(可一次执行多条 SQL 命令,但也不返回结果)。所有这些命令都可以与预编译语句(prepared statements)配合使用,并将参数值作为附加参数传入。例如:

db.all('SELECT ?::INTEGER AS fortytwo, ?::VARCHAR AS hello', 42, 'Hello, World', function(err, res) {
  if (err) {
    console.warn(err);
    return;
  }
  console.log(res[0].fortytwo)
  console.log(res[0].hello)
});

连接

一个数据库可以拥有多个 Connection(连接),这些连接通过 db.connect() 创建。

const con = db.connect();

你可以创建多个连接,每个连接都有其自己的事务上下文。

Connection 对象还包含快捷方式,可分别直接调用带有参数和回调函数的 run()all()each(),例如:

con.all('SELECT 42 AS fortytwo', function(err, res) {
  if (err) {
    console.warn(err);
    return;
  }
  console.log(res[0].fortytwo)
});

预处理语句

通过连接,你可以使用 con.prepare() 创建预编译语句(仅限此操作)。

const stmt = con.prepare('SELECT ?::INTEGER AS fortytwo');

要执行此语句,你可以例如在 stmt 对象上调用 all()

stmt.all(42, function(err, res) {
  if (err) {
    console.warn(err);
  } else {
    console.log(res[0].fortytwo)
  }
});

你还可以多次执行预编译语句。例如,这对于向表中填充数据非常有用。

con.run('CREATE TABLE a (i INTEGER)');
const stmt = con.prepare('INSERT INTO a VALUES (?)');
for (let i = 0; i < 10; i++) {
  stmt.run(i);
}
stmt.finalize();
con.all('SELECT * FROM a', function(err, res) {
  if (err) {
    console.warn(err);
  } else {
    console.log(res)
  }
});

prepare() 也可以接受一个回调函数,该函数以预编译语句作为参数。

const stmt = con.prepare('SELECT ?::INTEGER AS fortytwo', function(err, stmt) {
  stmt.all(42, function(err, res) {
    if (err) {
      console.warn(err);
    } else {
      console.log(res[0].fortytwo)
    }
  });
});

通过 Arrow 插入数据

Apache Arrow 可用于将数据插入 DuckDB 而无需进行复制。

const arrow = require('apache-arrow');
const db = new duckdb.Database(':memory:');

const jsonData = [
  {"userId":1,"id":1,"title":"delectus aut autem","completed":false},
  {"userId":1,"id":2,"title":"quis ut nam facilis et officia qui","completed":false}
];

// note; doesn't work on Windows yet
db.exec(`INSTALL arrow; LOAD arrow;`, (err) => {
    if (err) {
        console.warn(err);
        return;
    }

    const arrowTable = arrow.tableFromJSON(jsonData);
    db.register_buffer("jsonDataTable", [arrow.tableToIPC(arrowTable)], true, (err, res) => {
        if (err) {
            console.warn(err);
            return;
        }

        // `SELECT * FROM jsonDataTable` would return the entries in `jsonData`
    });
});

加载未签名扩展

要加载 未签名扩展,请按如下方式实例化数据库:

db = new duckdb.Database(':memory:', {"allow_unsigned_extensions": "true"});

本节页面

© 2025 DuckDB 基金会,阿姆斯特丹,荷兰
行为准则 商标使用指南