Waddler
Built by drizzle team
Waddler - is a thin SQL client on top of official DuckDB NodeJS driver with modern API inspired by postgresjs
and based on ES6 Tagged Template Strings.
npm i waddler duckdb
yarn add waddler duckdb
pnpm add waddler duckdb
bun add waddler duckdb
import { waddler } from "waddler" ;
const sql = waddler ({ dbUrl : ":memory:" });
await sql `select 1` ;
Waddler has a baked in database pooling which unlocks full potential of hosted DuckDB services like MotherDuck .
It does create multiple database instances under the hood and lets you concurrently fetch data from the remote MotherDuck database.
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 consists of sql
template, sql.identifier
, sql.values
and sql.raw
operators:
SQL template protects you from SQL injections:
await sql `select * from users where id = ${ 10 } ` ;
select * from users where id = $ 1 ;
-- 10 will be passed as a param [10]
SQL identifier lets you conveniently provide schema
, table
and column
names to the query. Those will be automatically properly escaped:
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 values API is designed to help you with insert statements:
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 raw lets you dynamically build SQL by embedding raw strings:
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" ;