Skip to main content
current (v0.1.x)

Query builder

buildQuery() creates a new QueryBuilder. Every clause is chainable and values are emitted as bound parameters rather than interpolated into SQL.

Select queries

import { buildQuery } from '@catbee/mysql';

const query = buildQuery()
.select('id', 'name', 'email')
.from('users')
.where('age', '>', 18)
.and('active', '=', true)
.orderBy('name', 'ASC')
.limit(10)
.offset(20);

const { sql, parameters } = query.build();
const result = await db.query(sql, parameters);

Table and qualified identifiers are escaped with MySQL backticks. Table references may include one alias, such as users u or app.users u.

Insert, update, and delete

const insertQuery = buildQuery().insert('users', {
name: 'Alice',
email: 'alice@example.com'
});

const updateQuery = buildQuery()
.update('users', { active: true })
.where('id', '=', userId);

const deleteQuery = buildQuery()
.delete('users')
.where('id', '=', userId);

Use build() and pass both values to the client:

const { sql, parameters } = updateQuery.build();
await db.execute(sql, parameters);

Joins and aggregates

const query = buildQuery()
.select('u.id', 'u.name', 'COUNT(p.id) AS post_count')
.from('users u')
.join('LEFT', 'posts p', 'u.id = p.user_id')
.where('u.active', '=', true)
.groupBy('u.id', 'u.name')
.having('post_count', '>', 5)
.orderBy('u.name', 'ASC');

Join conditions are supplied as SQL text and optional values:

buildQuery()
.select('*')
.from('users u')
.join('INNER', 'teams t', 'u.team_id = t.id AND t.region = ?', region);

Supported join types are INNER, LEFT, and RIGHT.

Filters

Comparison methods support =, !=, >, >=, <, <=, and LIKE:

buildQuery()
.select('*')
.from('users')
.where('role', '=', 'admin')
.or('role', '=', 'owner')
.andBetween('age', 18, 40)
.whereIn('status', ['active', 'pending']);

Available filter families are where, and, or, having, plus their In and Between variants. In lists must contain at least one value.

Inspect and reuse a builder

const query = buildQuery().select('*').from('users');

console.log(query.getSql());
console.log(query.getParameters());

const built = query.build();
query.reset().select('*').from('posts');