@workkit/d1
v0.1.1
Published
Type-safe D1 query helpers with query builder, batch operations, and migrations for Cloudflare Workers
Maintainers
Readme
@workkit/d1
Typed D1 client with query builder, column transforms, and classified errors
Install
bun add @workkit/d1Usage
Before (raw D1 API)
// Verbose prepared statements, manual snake_case conversion, generic errors
const stmt = env.DB.prepare("SELECT * FROM users WHERE id = ?").bind(id)
const result = await stmt.first()
const user = result as any // hope for the best
// result.created_at — stuck with snake_case from DB
// Errors are generic — was it a constraint violation? A syntax error?
try {
await env.DB.prepare("INSERT INTO users (id) VALUES (?)").bind(id).run()
} catch (e) {
// "D1_ERROR" — thanks, very helpful
}After (workkit d1)
import { d1 } from "@workkit/d1"
const db = d1(env.DB, { transformColumns: "camelCase" })
// Simple queries
const user = await db.first<User>("SELECT * FROM users WHERE id = ?", [id])
// user.createdAt — auto-transformed to camelCase
// Fluent query builder
const admins = await db
.select<User>("users")
.where("role = ?", ["admin"])
.orderBy("created_at", "DESC")
.limit(10)
.all()
// Insert with returning
const newUser = await db
.insert("users")
.values({ id: "123", name: "Alice", role: "admin" })
.returning<User>()
// Classified errors
try {
await db.insert("users").values({ id: "123" }).run()
} catch (e) {
if (e instanceof D1ConstraintError) {
// UNIQUE constraint failed — handle specifically
}
}API
d1(binding, options?)
Create a typed D1 client.
Options:
transformColumns—"camelCase"or a custom(column: string) => stringfunctionlogQueries— Log SQL to console (default:false)
Query Methods:
first<T>(sql, params?)— Get first row ornullall<T>(sql, params?)— Get all rowsrun(sql, params?)— Execute a write query, returnsD1RunResultexec(sql)— Execute raw SQL (multiple statements)batch(statements)— Execute multiple statements atomicallyprepare(sql)— Create a typed prepared statement
Query Builder:
select<T>(table)—.where(),.orderBy(),.limit(),.offset(),.all(),.first()insert(table)—.values(),.onConflict(),.returning(),.run()update(table)—.set(),.where(),.returning(),.run()delete(table)—.where(),.returning(),.run()
Error Classes
D1QueryError— SQL syntax or execution errorsD1ConstraintError— UNIQUE/FOREIGN KEY/CHECK constraint violationsD1BatchError— Batch execution failuresD1MigrationError— Migration-specific errorsclassifyD1Error(err)— Classify raw D1 errors into typed classes
License
MIT
