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;}