Skip to content

Commit 1319a75

Browse files
committed
feat(builder): add execOne && execList function
1 parent 9f3a34f commit 1319a75

File tree

3 files changed

+50
-10
lines changed

3 files changed

+50
-10
lines changed

packages/sqlite-builder/src/builder.ts

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import type { Compilable, CompiledQuery, KyselyPlugin, LogEvent, QueryResult, RawBuilder, Sql, Transaction } from 'kysely'
1+
import type { Compilable, CompiledQuery, KyselyPlugin, LogEvent, QueryResult, RawBuilder, Simplify, Sql, Transaction } from 'kysely'
22
import { Kysely, sql } from 'kysely'
33
import { SqliteSerializePlugin } from 'kysely-plugin-serialize'
44
import { parseTableMap, runCreateTable } from './util'
5-
import type { ITable, Logger, SqliteBuilderOption } from './types'
5+
import type { AvailableBuilder, ITable, Logger, SqliteBuilderOption } from './types'
66

77
const enum DBStatus {
88
'needDrop',
@@ -23,7 +23,7 @@ export class SqliteBuilder<DB extends Record<string, any>> {
2323
dialect,
2424
log: (event: LogEvent) => {
2525
event.level === 'error'
26-
? this.logger?.error('uncaught db error', event.error as Error)
26+
? this.logger?.error('Uncaught DB Error', event.error as Error)
2727
: onQuery?.(event.query, event.queryDurationMillis)
2828
},
2929
plugins,
@@ -52,28 +52,56 @@ export class SqliteBuilder<DB extends Record<string, any>> {
5252

5353
public async transaction<T>(
5454
cb: (trx: Transaction<DB>) => Promise<T>,
55-
errorMsg = 'transaction error',
55+
errorMsg?: string,
5656
): Promise<T | undefined> {
5757
if (await this.isEmptyTable()) {
5858
return undefined
5959
}
6060
return await this.kysely.transaction().execute(cb)
6161
.catch((err) => {
62-
this.logger?.error(errorMsg, err)
62+
errorMsg && this.logger?.error(errorMsg, err)
6363
return undefined
6464
})
6565
}
6666

6767
public async exec<T>(
6868
cb: (db: Kysely<DB>) => Promise<T>,
69-
errorMsg = 'execute error',
69+
errorMsg?: string,
7070
): Promise<T | undefined> {
7171
if (await this.isEmptyTable()) {
7272
return undefined
7373
}
7474
return cb(this.kysely)
7575
.catch((err) => {
76-
this.logger?.error(errorMsg, err)
76+
errorMsg && this.logger?.error(errorMsg, err)
77+
return undefined
78+
})
79+
}
80+
81+
public async execOne<O>(
82+
cb: (db: Kysely<DB>) => AvailableBuilder<DB, O>,
83+
errorMsg?: string,
84+
): Promise<Simplify<O> | undefined> {
85+
if (await this.isEmptyTable()) {
86+
return undefined
87+
}
88+
return cb(this.kysely).executeTakeFirstOrThrow()
89+
.catch((err) => {
90+
errorMsg && this.logger?.error(errorMsg, err)
91+
return undefined
92+
})
93+
}
94+
95+
public async execList<O>(
96+
cb: (db: Kysely<DB>) => AvailableBuilder<DB, O>,
97+
errorMsg?: string,
98+
): Promise<Simplify<O>[] | undefined> {
99+
if (await this.isEmptyTable()) {
100+
return undefined
101+
}
102+
return cb(this.kysely).execute()
103+
.catch((err) => {
104+
errorMsg && this.logger?.error(errorMsg, err)
77105
return undefined
78106
})
79107
}

packages/sqlite-builder/src/types.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { Dialect, Generated, KyselyPlugin, Sql } from 'kysely'
1+
import type { DeleteQueryBuilder, Dialect, Generated, InsertQueryBuilder, KyselyPlugin, SelectQueryBuilder, Sql, UpdateQueryBuilder } from 'kysely'
22
import type { CompiledQuery } from 'kysely/dist/cjs/query-compiler/compiled-query'
33

44
type Prettify<T> = {
@@ -55,4 +55,10 @@ export type Logger = {
5555
debug: (msg: string) => void
5656
warn: (msg: string) => void
5757
error: (msg: string, e?: Error) => void
58-
}
58+
}
59+
60+
export type AvailableBuilder<DB, O> =
61+
| SelectQueryBuilder<DB, keyof DB, O>
62+
| UpdateQueryBuilder<DB, keyof DB, keyof DB, O>
63+
| InsertQueryBuilder<DB, keyof DB, O>
64+
| DeleteQueryBuilder<DB, keyof DB, O>

test/builder.test.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,18 @@ describe('test builder', async () => {
4646
test('insert', async () => {
4747
// auto generate table
4848
await db.transaction(trx => trx.insertInto('test').values({ gender: false }).execute())
49-
const result = await db.exec(d => d.selectFrom('test').selectAll().execute())
49+
const result = await db.execList(d => d.selectFrom('test').selectAll())
5050
expect(result).toBeInstanceOf(Array)
5151
expect(result![0].person).toStrictEqual({ name: 'test' })
5252
expect(result![0].gender).toStrictEqual(false)
5353
expect(result![0].createAt).toBeInstanceOf(Date)
5454
expect(result![0].updateAt).toBeInstanceOf(Date)
55+
const result2 = await db.execOne(d => d.selectFrom('test').selectAll())
56+
expect(result).toBeInstanceOf(Object)
57+
expect(result2!.person).toStrictEqual({ name: 'test' })
58+
expect(result2!.gender).toStrictEqual(false)
59+
expect(result2!.createAt).toBeInstanceOf(Date)
60+
expect(result2!.updateAt).toBeInstanceOf(Date)
5561
})
5662
test('raw', async () => {
5763
const { sql, parameters } = await db.toSQL(d => d

0 commit comments

Comments
 (0)