已弃用 旧的DuckDB Node.js包已被弃用。 请改用DuckDB Node Neo包。
这个包提供了一个用于DuckDB的Node.js API。 该客户端的API在某种程度上符合SQLite Node.js客户端,以便于过渡。
对于TypeScript包装器,请参见duckdb-async项目。
初始化
加载包并创建一个数据库对象:
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);
}
});
Running a Query
以下代码片段使用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 命令,但也不返回结果。所有这些命令都可以与预处理语句一起使用,将参数的值作为附加参数传递。例如:
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)
});
Connections
一个数据库可以有多个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)
});
Prepared Statements
从连接中,你可以使用 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"});