Waddler

drizzle team 构建

Waddler 是一个基于官方 DuckDB NodeJS 驱动的轻量级 SQL 客户端,它拥有受 postgresjs 启发并基于 ES6 标签模板字符串的现代 API。

npm
yarn
pnpm
bun
npm i waddler duckdb
import { waddler } from "waddler";

const sql = waddler({ dbUrl: ":memory:" });

await sql`select 1`;

Waddler 内置了数据库连接池功能,这释放了 MotherDuck 等托管 DuckDB 服务的全部潜力。它在底层创建多个数据库实例,并允许您同时从远程 MotherDuck 数据库中获取数据。

import { waddler } from "waddler";

const sql = waddler({ dbUrl: "md:?…", min: 1, max: 8 }); // MotherDuck connection URL

// fetches concurrently
const res = await Promise.all([
	sql`select 1`,
	sql`select 2`,
]);

Waddler API 由 sql 模板、sql.identifiersql.valuessql.raw 操作符组成。

SQL 模板可保护您免受 SQL 注入攻击。

await sql`select * from users where id = ${10}`;
select * from users where id = $1;
-- 10 will be passed as a param [10]

SQL 标识符让您方便地为查询提供 schematablecolumn 名称。这些名称将自动正确转义。

await sql`select * from ${sql.identifier("users")}`;
await sql`select * from ${sql.identifier({ schema: "public", table: "users" })}`;

const userIdColumn = sql.identifier({ schema: "public", table: "users", column: "id", as: "userId"});
await sql`select ${userIdColumn} from "users"`;
select * from "users";
select * from "public"."users";
select * from "public"."users"."id" as "userId" from "users";

SQL 值 API 旨在帮助您处理插入语句。

const tuples = [["Dan", 27], ["Oleksii", 25]];
await sql`insert into "users" ("name", "age") values ${sql.values(tuples)}`;
insert into "users" ("name", "age") values ('Dan', 27), ('Oleksii', 25);

SQL 原始语句允许您通过嵌入原始字符串来动态构建 SQL。

const listUsers = async (filter: string | undefined) => {
  const whereClause = filter ? sql.raw(` where ${filter}`) : sql.raw("");
  return sql`select * from "users"${whereClause}`;
}

await listUsers(`"id" = 10`);
await listUsers(`"name" = 'Dan'`);
await listUsers();
select * from "users" where "id" = 10;
select * from "users" where "name" = 'Dan';
select * from "users";