Package Exports
- workers-qb
- workers-qb/dist/index.js
- workers-qb/dist/index.mjs
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (workers-qb) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
workers-qb
Read the documentation here!
Zero dependencies Query Builder for Cloudflare Workers
This module provides a simple standardized interface while keeping the benefits and speed of using raw queries over a traditional ORM.
workers-qb is not intended to provide ORM-like functionality, rather to make it easier to interact with the database
from code for direct SQL access using convenient wrapper methods.
Currently, 3 databases are supported:
Features
- Zero dependencies.
- Fully typed/TypeScript support
- Type Checks for data read
- Create/drop tables
- Insert/Bulk Inserts/Update/Select/Delete/Join queries
- Modular selects
- On Conflict for Inserts and Updates
- Upsert
Installation
npm install workers-qb --saveExample for Cloudflare Workers D1
import { D1QB } from 'workers-qb'
export interface Env {
DB: any
}
export default {
async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {
const qb = new D1QB(env.DB)
type Employee = {
name: string
role: string
level: number
}
// Generated query: SELECT * FROM employees WHERE active = ?1
const employeeList = await qb
.fetchAll<Employee>({
tableName: 'employees',
where: {
conditions: 'active = ?1',
params: [true],
},
})
.execute()
// Or in a modular approach
const employeeList = await qb.select<Employee>('employees').where('active = ?', true).execute()
// You get IDE type hints on each employee data, like:
// employeeList.results[0].name
return Response.json({
activeEmployees: employeeList.results?.length || 0,
})
},
}Example for Cloudflare Workers with PostgreSQL
Remember to close the connection using ctx.waitUntil(qb.close()); or await qb.close(); at the end of your request.
You may also reuse this connection to execute multiple queries, or share it between multiple requests if you are using
a connection pool in front of your PostgreSQL.
You must also enable node_compat = true in your wrangler.toml
You need to install node-postgres:
npm install pg --saveimport { PGQB } from 'workers-qb'
import { Client } from 'pg'
export interface Env {
DB_URL: string
}
export default {
async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> {
const qb = new PGQB(new Client(env.DB_URL))
await qb.connect()
// Generated query: SELECT count(*) as count FROM employees WHERE active = ?1 LIMIT 1
const fetched = await qb
.fetchOne({
tableName: 'employees',
fields: 'count(*) as count',
where: {
conditions: 'active = ?1',
params: [true],
},
})
.execute()
ctx.waitUntil(qb.close())
return Response.json({
activeEmployees: fetched.results?.count || 0,
})
},
}