Database connection with Waddler

Waddler runs SQL queries on your database via database drivers.

index.ts
import { waddler } from "waddler/duckdb-neo"

const sql = waddler({ url: process.env.DATABASE_URL });
const usersCount = await sql`select count(*) from ${sql.identifier('users')};`;
          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
          β”‚  sql`select count(*) from ${sql.identifier('users')};`  β”‚ <--- waddler query
          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     
                               β”‚               ʌ
select count(*) from "users"; -β”‚               β”‚
                               β”‚               β”‚- [{ count: 0 }]
                               v               β”‚
                            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                            β”‚     duckdb-neo      β”‚ <--- database driver
                            β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                               β”‚               ʌ
01101000 01100101 01111001    -β”‚               β”‚
                               β”‚               β”‚- 01110011 01110101 01110000
                               v               β”‚
                            β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                            β”‚      Database      β”‚ 
                            β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Under the hood, Waddler has a pool that creates a duckdb-neo driver instance when needed.

import { DuckDBInstance } from '@duckdb/node-api';

const instance = await DuckDBInstance.create(url, {
	accessMode: 'read_write', // default value
  maxMemory: '512MB', // default value
  threads = '4' // default value
});
const connection = await instance.connect();
// The connection can then be used to query your database

Waddler is by design natively compatible with every edge or serverless runtime, whenever you’d need access to a serverless database - we’ve got you covered

Neon HTTP
Neon with websockets
Vercel Postgres
PlanetScale HTTP
Cloudflare d1
import { waddler } from "waddler/neon-http";

const sql = waddler(process.env.DATABASE_URL);

And yes, we do support runtime specific drivers like Bun SQLite or Expo SQLite:

import { waddler } from "waddler/bun-sqlite"

const sql = waddler(); // <--- will create an in-memory db
const sql = waddler("./sqlite.db");
import { waddler } from "waddler/expo-sqlite";
import { openDatabaseSync } from "expo-sqlite";

const expo = openDatabaseSync("db.db");
const sql = waddler({ client: expo });

Database connection URL

Just in case if you’re not familiar with database connection URL concept

Local database file:

./<path-to-your-local-database-file>

MotherDuck connection string:

md:?motherduck_token=<token>

Next steps

Feel free to check out per-driver documentations