Waddler

Waddler - is a thin SQL client wrapper with modern API inspired by postgresjs and based on ES6 Tagged Template Strings.

You don’t need to learn an api for db clients; just use the sql template tag for everything

Waddler is our vision of a modern, all-in-one client for any database dialect. It doesn’t perform any specific mappings to or from a database, doesn’t handle complex query building, and doesn’t parse queries. Waddler simply unifies communication with your database using any client you choose - whether it’s a simple TCP connection or an HTTP-based DB client.

We support all the dialects and drivers that Drizzle supports

You can check a full list of clients you can use - here

import { waddler } from "waddler/...";

const sql = waddler({ dbUrl: process.env.DATABASE_URL });

await sql`select 1`;

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";