Skip to content

Kysely SQLite synchronous execution

better-sqlite3 supports synchronous execution (Drizzle as well). But Kysely doesn’t. You can use following hack

import { type Database as SQLite } from "better-sqlite3";
import {
DeleteQueryBuilder,
InsertQueryBuilder,
SelectQueryBuilder,
UpdateQueryBuilder,
} from "kysely";
export type AllDb = {
kysely: KyselyDb;
// passing SQLite around for sync execution
sqlite: SQLite;
};
function syncDelete<DB, TB extends keyof DB, O>(
db: AllDb,
query: DeleteQueryBuilder<DB, TB, O>
) {
const c = query.compile();
const params = c.parameters.map((x) =>
typeof x === "object" && x !== null ? JSON.stringify(x) : x
);
db.sqlite.prepare(c.sql).run(...params);
}
export function syncUpdate<DB, UT extends keyof DB, TB extends keyof DB, O>(
db: AllDb,
query: UpdateQueryBuilder<DB, UT, TB, O>
) {
const c = query.compile();
const params = c.parameters.map((x) =>
typeof x === "object" && x !== null ? JSON.stringify(x) : x
);
db.sqlite.prepare(c.sql).run(...params);
}
export function syncInsert<DB, TB extends keyof DB, O>(
db: AllDb,
query: InsertQueryBuilder<DB, TB, O>
) {
const c = query.compile();
const params = c.parameters.map((x) =>
typeof x === "object" && x !== null ? JSON.stringify(x) : x
);
db.sqlite.prepare(c.sql).run(...params);
}
export function syncSelect<DB, TB extends keyof DB, O>(
db: AllDb,
query: SelectQueryBuilder<DB, TB, O>
): Awaited<ReturnType<SelectQueryBuilder<DB, TB, O>["execute"]>> {
const c = query.compile();
const params = c.parameters.map((x) =>
typeof x === "object" && x !== null ? JSON.stringify(x) : x
);
return db.sqlite.prepare(c.sql).all(...params) as any;
}