@simplysm/orm-common 14.0.100 → 14.0.102
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/db-context.d.ts +0 -17
- package/dist/db-context.d.ts.map +1 -1
- package/dist/db-context.js +0 -17
- package/dist/db-context.js.map +1 -1
- package/dist/errors/db-transaction-error.d.ts +0 -15
- package/dist/errors/db-transaction-error.d.ts.map +1 -1
- package/dist/errors/db-transaction-error.js +0 -15
- package/dist/errors/db-transaction-error.js.map +1 -1
- package/dist/exec/executable.d.ts +0 -24
- package/dist/exec/executable.d.ts.map +1 -1
- package/dist/exec/executable.js +0 -24
- package/dist/exec/executable.js.map +1 -1
- package/dist/exec/queryable.d.ts +0 -300
- package/dist/exec/queryable.d.ts.map +1 -1
- package/dist/exec/queryable.js +0 -213
- package/dist/exec/queryable.js.map +1 -1
- package/dist/expr/expr.d.ts +0 -689
- package/dist/expr/expr.d.ts.map +1 -1
- package/dist/expr/expr.js +0 -689
- package/dist/expr/expr.js.map +1 -1
- package/dist/schema/factory/column-builder.d.ts +0 -86
- package/dist/schema/factory/column-builder.d.ts.map +1 -1
- package/dist/schema/factory/column-builder.js +0 -74
- package/dist/schema/factory/column-builder.js.map +1 -1
- package/dist/schema/factory/index-builder.d.ts +0 -60
- package/dist/schema/factory/index-builder.d.ts.map +1 -1
- package/dist/schema/factory/index-builder.js +0 -60
- package/dist/schema/factory/index-builder.js.map +1 -1
- package/dist/schema/factory/relation-builder.d.ts +0 -83
- package/dist/schema/factory/relation-builder.d.ts.map +1 -1
- package/dist/schema/factory/relation-builder.js +0 -77
- package/dist/schema/factory/relation-builder.js.map +1 -1
- package/dist/schema/procedure-builder.d.ts +0 -87
- package/dist/schema/procedure-builder.d.ts.map +1 -1
- package/dist/schema/procedure-builder.js +0 -87
- package/dist/schema/procedure-builder.js.map +1 -1
- package/dist/schema/table-builder.d.ts +0 -127
- package/dist/schema/table-builder.d.ts.map +1 -1
- package/dist/schema/table-builder.js +0 -127
- package/dist/schema/table-builder.js.map +1 -1
- package/dist/schema/view-builder.d.ts +0 -76
- package/dist/schema/view-builder.d.ts.map +1 -1
- package/dist/schema/view-builder.js +0 -76
- package/dist/schema/view-builder.js.map +1 -1
- package/dist/types/column.d.ts +0 -38
- package/dist/types/column.d.ts.map +1 -1
- package/dist/types/column.js +0 -13
- package/dist/types/column.js.map +1 -1
- package/dist/types/db.d.ts +0 -54
- package/dist/types/db.d.ts.map +1 -1
- package/dist/types/db.js +0 -8
- package/dist/types/db.js.map +1 -1
- package/dist/utils/result-parser.d.ts +0 -21
- package/dist/utils/result-parser.d.ts.map +1 -1
- package/dist/utils/result-parser.js +0 -24
- package/dist/utils/result-parser.js.map +1 -1
- package/package.json +2 -2
- package/src/db-context.ts +0 -17
- package/src/errors/db-transaction-error.ts +0 -15
- package/src/exec/executable.ts +0 -24
- package/src/exec/queryable.ts +0 -300
- package/src/expr/expr.ts +0 -689
- package/src/schema/factory/column-builder.ts +0 -86
- package/src/schema/factory/index-builder.ts +0 -60
- package/src/schema/factory/relation-builder.ts +0 -83
- package/src/schema/procedure-builder.ts +0 -87
- package/src/schema/table-builder.ts +0 -127
- package/src/schema/view-builder.ts +0 -76
- package/src/types/column.ts +0 -38
- package/src/types/db.ts +0 -54
- package/src/utils/result-parser.ts +0 -24
package/src/exec/queryable.ts
CHANGED
|
@@ -207,23 +207,6 @@ class RecursiveQueryable<TBaseData extends DataRecord> {
|
|
|
207
207
|
*
|
|
208
208
|
* @template TData - Query 결과의 데이터 타입
|
|
209
209
|
* @template TFrom - 소스 table (CUD 연산에 필요)
|
|
210
|
-
*
|
|
211
|
-
* @example
|
|
212
|
-
* ```typescript
|
|
213
|
-
* // Basic query
|
|
214
|
-
* const users = await db.user()
|
|
215
|
-
* .where((u) => [expr.eq(u.isActive, true)])
|
|
216
|
-
* .orderBy((u) => u.name)
|
|
217
|
-
* .execute();
|
|
218
|
-
*
|
|
219
|
-
* // JOIN query
|
|
220
|
-
* const posts = await db.post()
|
|
221
|
-
* .include((p) => p.user)
|
|
222
|
-
* .execute();
|
|
223
|
-
*
|
|
224
|
-
* // INSERT
|
|
225
|
-
* await db.user().insert([{ name: "Gildong Hong", email: "test@test.com" }]);
|
|
226
|
-
* ```
|
|
227
210
|
*/
|
|
228
211
|
export class Queryable<
|
|
229
212
|
TData extends DataRecord,
|
|
@@ -238,14 +221,6 @@ export class Queryable<
|
|
|
238
221
|
*
|
|
239
222
|
* @param fn - Column 매핑 함수. 원본 column을 받아 새 column 구조를 반환
|
|
240
223
|
* @returns 새 column 구조가 적용된 Queryable
|
|
241
|
-
*
|
|
242
|
-
* @example
|
|
243
|
-
* ```typescript
|
|
244
|
-
* db.user().select((u) => ({
|
|
245
|
-
* userName: u.name,
|
|
246
|
-
* userEmail: u.email,
|
|
247
|
-
* }))
|
|
248
|
-
* ```
|
|
249
224
|
*/
|
|
250
225
|
select<R extends Record<string, any>>(
|
|
251
226
|
fn: (columns: QueryableRecord<TData>) => R,
|
|
@@ -263,13 +238,6 @@ export class Queryable<
|
|
|
263
238
|
* 중복 행 제거를 위한 DISTINCT 옵션 적용
|
|
264
239
|
*
|
|
265
240
|
* @returns DISTINCT가 적용된 Queryable
|
|
266
|
-
*
|
|
267
|
-
* @example
|
|
268
|
-
* ```typescript
|
|
269
|
-
* db.user()
|
|
270
|
-
* .select((u) => ({ name: u.name }))
|
|
271
|
-
* .distinct()
|
|
272
|
-
* ```
|
|
273
241
|
*/
|
|
274
242
|
distinct(): Queryable<TData, never> {
|
|
275
243
|
return new Queryable({
|
|
@@ -284,16 +252,6 @@ export class Queryable<
|
|
|
284
252
|
* 트랜잭션 내에서 선택된 행에 대한 배타적 잠금 획득
|
|
285
253
|
*
|
|
286
254
|
* @returns 잠금이 적용된 Queryable
|
|
287
|
-
*
|
|
288
|
-
* @example
|
|
289
|
-
* ```typescript
|
|
290
|
-
* await db.connect(async () => {
|
|
291
|
-
* const user = await db.user()
|
|
292
|
-
* .where((u) => [expr.eq(u.id, 1)])
|
|
293
|
-
* .lock()
|
|
294
|
-
* .single();
|
|
295
|
-
* });
|
|
296
|
-
* ```
|
|
297
255
|
*/
|
|
298
256
|
lock(): Queryable<TData, TFrom> {
|
|
299
257
|
return new Queryable({
|
|
@@ -311,14 +269,6 @@ export class Queryable<
|
|
|
311
269
|
*
|
|
312
270
|
* @param count - 선택할 행 수
|
|
313
271
|
* @returns TOP이 적용된 Queryable
|
|
314
|
-
*
|
|
315
|
-
* @example
|
|
316
|
-
* ```typescript
|
|
317
|
-
* // Latest 10 users
|
|
318
|
-
* db.user()
|
|
319
|
-
* .orderBy((u) => u.createdAt, "DESC")
|
|
320
|
-
* .top(10)
|
|
321
|
-
* ```
|
|
322
272
|
*/
|
|
323
273
|
top(count: number): Queryable<TData, TFrom> {
|
|
324
274
|
return new Queryable({
|
|
@@ -335,13 +285,6 @@ export class Queryable<
|
|
|
335
285
|
* @param take - 가져올 행 수 (LIMIT)
|
|
336
286
|
* @returns 페이지네이션이 적용된 Queryable
|
|
337
287
|
* @throws ORDER BY 절이 없으면 에러
|
|
338
|
-
*
|
|
339
|
-
* @example
|
|
340
|
-
* ```typescript
|
|
341
|
-
* db.user
|
|
342
|
-
* .orderBy((u) => u.createdAt)
|
|
343
|
-
* .limit(0, 20) // first 20
|
|
344
|
-
* ```
|
|
345
288
|
*/
|
|
346
289
|
limit(skip: number, take: number): Queryable<TData, TFrom> {
|
|
347
290
|
if (!this.meta.orderBy) {
|
|
@@ -370,15 +313,6 @@ export class Queryable<
|
|
|
370
313
|
* @param fnOrKey - 정렬할 column을 반환하는 함수 또는 체인 경로 문자열
|
|
371
314
|
* @param orderBy - 정렬 방향 (ASC/DESC). 기본값: ASC
|
|
372
315
|
* @returns 정렬 조건이 추가된 Queryable
|
|
373
|
-
*
|
|
374
|
-
* @example
|
|
375
|
-
* ```typescript
|
|
376
|
-
* db.user
|
|
377
|
-
* .orderBy((u) => u.name) // name ASC
|
|
378
|
-
* .orderBy((u) => u.age, "DESC") // age DESC
|
|
379
|
-
* .orderBy("id", "DESC") // string overload
|
|
380
|
-
* .orderBy("user.name") // chain path
|
|
381
|
-
* ```
|
|
382
316
|
*/
|
|
383
317
|
orderBy(
|
|
384
318
|
fnOrKey: string | ((columns: QueryableRecord<TData>) => ExprUnit<ColumnPrimitive>),
|
|
@@ -407,13 +341,6 @@ export class Queryable<
|
|
|
407
341
|
*
|
|
408
342
|
* @param predicate - 조건 배열을 반환하는 함수
|
|
409
343
|
* @returns 조건이 추가된 Queryable
|
|
410
|
-
*
|
|
411
|
-
* @example
|
|
412
|
-
* ```typescript
|
|
413
|
-
* db.user
|
|
414
|
-
* .where((u) => [expr.eq(u.isActive, true)])
|
|
415
|
-
* .where((u) => [expr.gte(u.age, 18)])
|
|
416
|
-
* ```
|
|
417
344
|
*/
|
|
418
345
|
where(predicate: (columns: QueryableRecord<TData>) => WhereExprUnit[]): Queryable<TData, TFrom> {
|
|
419
346
|
const conditions = predicate(this.meta.columns);
|
|
@@ -435,12 +362,6 @@ export class Queryable<
|
|
|
435
362
|
* @param fn - 검색 대상 column을 반환하는 함수
|
|
436
363
|
* @param searchText - 검색 텍스트
|
|
437
364
|
* @returns 검색 조건이 추가된 Queryable
|
|
438
|
-
*
|
|
439
|
-
* @example
|
|
440
|
-
* ```typescript
|
|
441
|
-
* db.user()
|
|
442
|
-
* .search((u) => [u.name, u.email], "John Doe -withdrawn")
|
|
443
|
-
* ```
|
|
444
365
|
*/
|
|
445
366
|
search(
|
|
446
367
|
fn: (columns: QueryableRecord<TData>) => ExprUnit<string | undefined>[],
|
|
@@ -498,16 +419,6 @@ export class Queryable<
|
|
|
498
419
|
*
|
|
499
420
|
* @param fn - 그룹화할 column을 반환하는 함수
|
|
500
421
|
* @returns GROUP BY가 적용된 Queryable
|
|
501
|
-
*
|
|
502
|
-
* @example
|
|
503
|
-
* ```typescript
|
|
504
|
-
* db.order()
|
|
505
|
-
* .select((o) => ({
|
|
506
|
-
* userId: o.userId,
|
|
507
|
-
* totalAmount: expr.sum(o.amount),
|
|
508
|
-
* }))
|
|
509
|
-
* .groupBy((o) => [o.userId])
|
|
510
|
-
* ```
|
|
511
422
|
*/
|
|
512
423
|
groupBy(
|
|
513
424
|
fn: (columns: QueryableRecord<TData>) => ExprUnit<ColumnPrimitive>[],
|
|
@@ -522,17 +433,6 @@ export class Queryable<
|
|
|
522
433
|
*
|
|
523
434
|
* @param predicate - 조건 배열을 반환하는 함수
|
|
524
435
|
* @returns HAVING이 적용된 Queryable
|
|
525
|
-
*
|
|
526
|
-
* @example
|
|
527
|
-
* ```typescript
|
|
528
|
-
* db.order()
|
|
529
|
-
* .select((o) => ({
|
|
530
|
-
* userId: o.userId,
|
|
531
|
-
* totalAmount: expr.sum(o.amount),
|
|
532
|
-
* }))
|
|
533
|
-
* .groupBy((o) => [o.userId])
|
|
534
|
-
* .having((o) => [expr.gte(o.totalAmount, 10000)])
|
|
535
|
-
* ```
|
|
536
436
|
*/
|
|
537
437
|
having(predicate: (columns: QueryableRecord<TData>) => WhereExprUnit[]): Queryable<TData, never> {
|
|
538
438
|
const conditions = predicate(this.meta.columns);
|
|
@@ -553,16 +453,6 @@ export class Queryable<
|
|
|
553
453
|
* @param as - 결과에 추가할 속성 이름
|
|
554
454
|
* @param fn - 조인 조건을 정의하는 콜백 함수
|
|
555
455
|
* @returns 조인 결과가 배열로 추가된 Queryable
|
|
556
|
-
*
|
|
557
|
-
* @example
|
|
558
|
-
* ```typescript
|
|
559
|
-
* db.user()
|
|
560
|
-
* .join("posts", (qr, u) =>
|
|
561
|
-
* qr.from(Post)
|
|
562
|
-
* .where((p) => [expr.eq(p.userId, u.id)])
|
|
563
|
-
* )
|
|
564
|
-
* // Result: { id, name, posts: [{ id, title }, ...] }
|
|
565
|
-
* ```
|
|
566
456
|
*/
|
|
567
457
|
join<A extends string, R extends DataRecord>(
|
|
568
458
|
as: A,
|
|
@@ -597,16 +487,6 @@ export class Queryable<
|
|
|
597
487
|
* @param as - 결과에 추가할 속성 이름
|
|
598
488
|
* @param fn - 조인 조건을 정의하는 콜백 함수
|
|
599
489
|
* @returns 조인 결과가 단일 객체로 추가된 Queryable
|
|
600
|
-
*
|
|
601
|
-
* @example
|
|
602
|
-
* ```typescript
|
|
603
|
-
* db.post()
|
|
604
|
-
* .joinSingle("user", (qr, p) =>
|
|
605
|
-
* qr.from(User)
|
|
606
|
-
* .where((u) => [expr.eq(u.id, p.userId)])
|
|
607
|
-
* )
|
|
608
|
-
* // Result: { id, title, user: { id, name } | undefined }
|
|
609
|
-
* ```
|
|
610
490
|
*/
|
|
611
491
|
joinSingle<A extends string, R extends DataRecord>(
|
|
612
492
|
as: A,
|
|
@@ -649,20 +529,6 @@ export class Queryable<
|
|
|
649
529
|
* @param fn - 포함할 관계를 선택하는 함수 (PathProxy를 통해 타입 체크)
|
|
650
530
|
* @returns JOIN이 추가된 Queryable
|
|
651
531
|
* @throws 관계가 정의되지 않은 경우 에러
|
|
652
|
-
*
|
|
653
|
-
* @example
|
|
654
|
-
* ```typescript
|
|
655
|
-
* // Single relationship include
|
|
656
|
-
* db.post.include((p) => p.user)
|
|
657
|
-
*
|
|
658
|
-
* // Nested relationship include
|
|
659
|
-
* db.post.include((p) => p.user.company)
|
|
660
|
-
*
|
|
661
|
-
* // Multiple relationship include
|
|
662
|
-
* db.user
|
|
663
|
-
* .include((u) => u.company)
|
|
664
|
-
* .include((u) => u.posts)
|
|
665
|
-
* ```
|
|
666
532
|
*/
|
|
667
533
|
include(fn: (item: PathProxy<TData>) => PathProxy<unknown>): Queryable<TData, TFrom> {
|
|
668
534
|
const proxy = createPathProxy<TData>();
|
|
@@ -818,16 +684,6 @@ export class Queryable<
|
|
|
818
684
|
* Required when using count() after distinct() or groupBy()
|
|
819
685
|
*
|
|
820
686
|
* @returns Queryable wrapped as a Subquery
|
|
821
|
-
*
|
|
822
|
-
* @example
|
|
823
|
-
* ```typescript
|
|
824
|
-
* // Count after DISTINCT
|
|
825
|
-
* const count = await db.user()
|
|
826
|
-
* .select((u) => ({ name: u.name }))
|
|
827
|
-
* .distinct()
|
|
828
|
-
* .wrap()
|
|
829
|
-
* .count();
|
|
830
|
-
* ```
|
|
831
687
|
*/
|
|
832
688
|
wrap(): Queryable<TData, never> {
|
|
833
689
|
// 현재 Queryable을 서브쿼리로 래핑
|
|
@@ -846,14 +702,6 @@ export class Queryable<
|
|
|
846
702
|
* @param queries - Array of Queryables to UNION (minimum 2)
|
|
847
703
|
* @returns UNION-ed Queryable
|
|
848
704
|
* @throws If less than 2 queryables are passed
|
|
849
|
-
*
|
|
850
|
-
* @example
|
|
851
|
-
* ```typescript
|
|
852
|
-
* const combined = Queryable.union(
|
|
853
|
-
* db.user().where((u) => [expr.eq(u.type, "admin")]),
|
|
854
|
-
* db.user().where((u) => [expr.eq(u.type, "manager")]),
|
|
855
|
-
* );
|
|
856
|
-
* ```
|
|
857
705
|
*/
|
|
858
706
|
static union<TData extends DataRecord>(
|
|
859
707
|
...queries: Queryable<TData, any>[]
|
|
@@ -886,17 +734,6 @@ export class Queryable<
|
|
|
886
734
|
*
|
|
887
735
|
* @param fn - Callback function that defines the recursive part
|
|
888
736
|
* @returns Queryable with the recursive CTE applied
|
|
889
|
-
*
|
|
890
|
-
* @example
|
|
891
|
-
* ```typescript
|
|
892
|
-
* // Query org chart hierarchy
|
|
893
|
-
* db.employee()
|
|
894
|
-
* .where((e) => [expr.null(e.managerId)]) // Root nodes
|
|
895
|
-
* .recursive((cte) =>
|
|
896
|
-
* cte.from(Employee)
|
|
897
|
-
* .where((e) => [expr.eq(e.managerId, e.self[0].id)])
|
|
898
|
-
* )
|
|
899
|
-
* ```
|
|
900
737
|
*/
|
|
901
738
|
recursive(
|
|
902
739
|
fn: (qr: RecursiveQueryable<TData>) => Queryable<TData, any>,
|
|
@@ -931,13 +768,6 @@ export class Queryable<
|
|
|
931
768
|
* Execute a SELECT query and return the result array
|
|
932
769
|
*
|
|
933
770
|
* @returns Query result array
|
|
934
|
-
*
|
|
935
|
-
* @example
|
|
936
|
-
* ```typescript
|
|
937
|
-
* const users = await db.user()
|
|
938
|
-
* .where((u) => [expr.eq(u.isActive, true)])
|
|
939
|
-
* .execute();
|
|
940
|
-
* ```
|
|
941
771
|
*/
|
|
942
772
|
async execute(): Promise<TData[]> {
|
|
943
773
|
const results = await this.meta.db.executeDefs<TData>(
|
|
@@ -952,13 +782,6 @@ export class Queryable<
|
|
|
952
782
|
*
|
|
953
783
|
* @returns Single result or undefined
|
|
954
784
|
* @throws When more than one result is returned
|
|
955
|
-
*
|
|
956
|
-
* @example
|
|
957
|
-
* ```typescript
|
|
958
|
-
* const user = await db.user()
|
|
959
|
-
* .where((u) => [expr.eq(u.id, 1)])
|
|
960
|
-
* .single();
|
|
961
|
-
* ```
|
|
962
785
|
*/
|
|
963
786
|
async single(): Promise<TData | undefined> {
|
|
964
787
|
const result = await this.execute();
|
|
@@ -989,13 +812,6 @@ export class Queryable<
|
|
|
989
812
|
* Return the first result (only the first even if multiple exist)
|
|
990
813
|
*
|
|
991
814
|
* @returns First result or undefined
|
|
992
|
-
*
|
|
993
|
-
* @example
|
|
994
|
-
* ```typescript
|
|
995
|
-
* const latestUser = await db.user()
|
|
996
|
-
* .orderBy((u) => u.createdAt, "DESC")
|
|
997
|
-
* .first();
|
|
998
|
-
* ```
|
|
999
815
|
*/
|
|
1000
816
|
async first(): Promise<TData | undefined> {
|
|
1001
817
|
const results = await this.top(1).execute();
|
|
@@ -1008,13 +824,6 @@ export class Queryable<
|
|
|
1008
824
|
* @param fn - Function to specify the column to count (optional)
|
|
1009
825
|
* @returns Number of rows
|
|
1010
826
|
* @throws Error when called directly after distinct() or groupBy() (use wrap() first)
|
|
1011
|
-
*
|
|
1012
|
-
* @example
|
|
1013
|
-
* ```typescript
|
|
1014
|
-
* const count = await db.user()
|
|
1015
|
-
* .where((u) => [expr.eq(u.isActive, true)])
|
|
1016
|
-
* .count();
|
|
1017
|
-
* ```
|
|
1018
827
|
*/
|
|
1019
828
|
async count(fn?: (cols: QueryableRecord<TData>) => ExprUnit<ColumnPrimitive>): Promise<number> {
|
|
1020
829
|
if (this.meta.distinct) {
|
|
@@ -1037,13 +846,6 @@ export class Queryable<
|
|
|
1037
846
|
* Check whether data matching the conditions exists
|
|
1038
847
|
*
|
|
1039
848
|
* @returns true if exists, false otherwise
|
|
1040
|
-
*
|
|
1041
|
-
* @example
|
|
1042
|
-
* ```typescript
|
|
1043
|
-
* const hasAdmin = await db.user()
|
|
1044
|
-
* .where((u) => [expr.eq(u.role, "admin")])
|
|
1045
|
-
* .exists();
|
|
1046
|
-
* ```
|
|
1047
849
|
*/
|
|
1048
850
|
async exists(): Promise<boolean> {
|
|
1049
851
|
const result = await this.top(1).execute();
|
|
@@ -1189,20 +991,6 @@ export class Queryable<
|
|
|
1189
991
|
* @param records - Array of records to insert
|
|
1190
992
|
* @param outputColumns - Column name array to receive (optional)
|
|
1191
993
|
* @returns When outputColumns specified, returns array of inserted records
|
|
1192
|
-
*
|
|
1193
|
-
* @example
|
|
1194
|
-
* ```typescript
|
|
1195
|
-
* // Simple insert
|
|
1196
|
-
* await db.user().insert([
|
|
1197
|
-
* { name: "Gildong Hong", email: "hong@test.com" },
|
|
1198
|
-
* ]);
|
|
1199
|
-
*
|
|
1200
|
-
* // Return ID after insert
|
|
1201
|
-
* const [inserted] = await db.user().insert(
|
|
1202
|
-
* [{ name: "Gildong Hong" }],
|
|
1203
|
-
* ["id"],
|
|
1204
|
-
* );
|
|
1205
|
-
* ```
|
|
1206
994
|
*/
|
|
1207
995
|
async insert(records: TFrom["$inferInsert"][]): Promise<void>;
|
|
1208
996
|
async insert<K extends keyof TFrom["$inferColumns"] & string>(
|
|
@@ -1245,13 +1033,6 @@ export class Queryable<
|
|
|
1245
1033
|
* @param record - Record to insert
|
|
1246
1034
|
* @param outputColumns - Column name array to receive (optional)
|
|
1247
1035
|
* @returns When outputColumns specified, returns the inserted record
|
|
1248
|
-
*
|
|
1249
|
-
* @example
|
|
1250
|
-
* ```typescript
|
|
1251
|
-
* await db.user()
|
|
1252
|
-
* .where((u) => [expr.eq(u.email, "test@test.com")])
|
|
1253
|
-
* .insertIfNotExists({ name: "testing", email: "test@test.com" });
|
|
1254
|
-
* ```
|
|
1255
1036
|
*/
|
|
1256
1037
|
async insertIfNotExists(record: TFrom["$inferInsert"]): Promise<void>;
|
|
1257
1038
|
async insertIfNotExists<K extends keyof TFrom["$inferColumns"] & string>(
|
|
@@ -1278,14 +1059,6 @@ export class Queryable<
|
|
|
1278
1059
|
* @param targetTable - Target Table to insert into
|
|
1279
1060
|
* @param outputColumns - Column name array to receive (optional)
|
|
1280
1061
|
* @returns When outputColumns specified, returns array of inserted records
|
|
1281
|
-
*
|
|
1282
|
-
* @example
|
|
1283
|
-
* ```typescript
|
|
1284
|
-
* await db.user()
|
|
1285
|
-
* .select((u) => ({ name: u.name, createdAt: u.createdAt }))
|
|
1286
|
-
* .where((u) => [expr.eq(u.isArchived, false)])
|
|
1287
|
-
* .insertInto(ArchivedUser);
|
|
1288
|
-
* ```
|
|
1289
1062
|
*/
|
|
1290
1063
|
async insertInto<TTable extends TableBuilder<any, DataToColumnBuilderRecord<TData>, any>>(
|
|
1291
1064
|
targetTable: TTable,
|
|
@@ -1390,23 +1163,6 @@ export class Queryable<
|
|
|
1390
1163
|
* @param recordFwd - Function that returns the columns and values to update
|
|
1391
1164
|
* @param outputColumns - Column name array to receive (optional)
|
|
1392
1165
|
* @returns When outputColumns specified, returns array of updated records
|
|
1393
|
-
*
|
|
1394
|
-
* @example
|
|
1395
|
-
* ```typescript
|
|
1396
|
-
* // Simple update
|
|
1397
|
-
* await db.user()
|
|
1398
|
-
* .where((u) => [expr.eq(u.id, 1)])
|
|
1399
|
-
* .update((u) => ({
|
|
1400
|
-
* name: expr.val("string", "New Name"),
|
|
1401
|
-
* updatedAt: expr.val("DateTime", DateTime.now()),
|
|
1402
|
-
* }));
|
|
1403
|
-
*
|
|
1404
|
-
* // Reference existing value
|
|
1405
|
-
* await db.product()
|
|
1406
|
-
* .update((p) => ({
|
|
1407
|
-
* price: expr.mul(p.price, expr.val("number", 1.1)),
|
|
1408
|
-
* }));
|
|
1409
|
-
* ```
|
|
1410
1166
|
*/
|
|
1411
1167
|
async update(
|
|
1412
1168
|
recordFwd: (cols: QueryableRecord<TData>) => QueryableWriteRecord<TFrom["$inferUpdate"]>,
|
|
@@ -1434,19 +1190,6 @@ export class Queryable<
|
|
|
1434
1190
|
*
|
|
1435
1191
|
* @param outputColumns - Column name array to receive (optional)
|
|
1436
1192
|
* @returns When outputColumns specified, returns array of deleted records
|
|
1437
|
-
*
|
|
1438
|
-
* @example
|
|
1439
|
-
* ```typescript
|
|
1440
|
-
* // Simple delete
|
|
1441
|
-
* await db.user()
|
|
1442
|
-
* .where((u) => [expr.eq(u.id, 1)])
|
|
1443
|
-
* .delete();
|
|
1444
|
-
*
|
|
1445
|
-
* // Return deleted data
|
|
1446
|
-
* const deleted = await db.user()
|
|
1447
|
-
* .where((u) => [expr.eq(u.isExpired, true)])
|
|
1448
|
-
* .delete(["id", "name"]);
|
|
1449
|
-
* ```
|
|
1450
1193
|
*/
|
|
1451
1194
|
async delete(): Promise<void>;
|
|
1452
1195
|
async delete<K extends keyof TFrom["$inferColumns"] & string>(
|
|
@@ -1526,25 +1269,6 @@ export class Queryable<
|
|
|
1526
1269
|
* @param insertFn - Function that returns the record to insert (optional, defaults to same as updateFn)
|
|
1527
1270
|
* @param outputColumns - Column name array to receive (optional)
|
|
1528
1271
|
* @returns When outputColumns specified, returns array of affected records
|
|
1529
|
-
*
|
|
1530
|
-
* @example
|
|
1531
|
-
* ```typescript
|
|
1532
|
-
* // Same data for UPDATE/INSERT
|
|
1533
|
-
* await db.user()
|
|
1534
|
-
* .where((u) => [expr.eq(u.email, "test@test.com")])
|
|
1535
|
-
* .upsert(() => ({
|
|
1536
|
-
* name: expr.val("string", "testing"),
|
|
1537
|
-
* email: expr.val("string", "test@test.com"),
|
|
1538
|
-
* }));
|
|
1539
|
-
*
|
|
1540
|
-
* // Different data for UPDATE/INSERT
|
|
1541
|
-
* await db.user()
|
|
1542
|
-
* .where((u) => [expr.eq(u.email, "test@test.com")])
|
|
1543
|
-
* .upsert(
|
|
1544
|
-
* () => ({ loginCount: expr.val("number", 1) }),
|
|
1545
|
-
* (update) => ({ ...update, email: expr.val("string", "test@test.com") }),
|
|
1546
|
-
* );
|
|
1547
|
-
* ```
|
|
1548
1272
|
*/
|
|
1549
1273
|
async upsert(
|
|
1550
1274
|
updateFn: (cols: QueryableRecord<TData>) => QueryableWriteRecord<TFrom["$inferUpdate"]>,
|
|
@@ -1862,15 +1586,6 @@ export type UnwrapQueryableRecord<R> = {
|
|
|
1862
1586
|
/**
|
|
1863
1587
|
* include()에서 타입 안전하게 관계 경로를 지정하기 위한 Proxy 타입
|
|
1864
1588
|
* non-ColumnPrimitive 필드(FK, FKT 관계)만 접근 가능
|
|
1865
|
-
*
|
|
1866
|
-
* @example
|
|
1867
|
-
* ```typescript
|
|
1868
|
-
* // item.user.company 접근 시 내부적으로 경로 ["user", "company"]를 수집
|
|
1869
|
-
* db.post.include(item => item.user.company)
|
|
1870
|
-
*
|
|
1871
|
-
* // item.title은 string(ColumnPrimitive)이므로 컴파일 에러
|
|
1872
|
-
* db.post.include(item => item.title) // 컴파일 에러
|
|
1873
|
-
* ```
|
|
1874
1589
|
*/
|
|
1875
1590
|
/**
|
|
1876
1591
|
* 배열이면 요소 타입 추출
|
|
@@ -1930,21 +1645,6 @@ function createPathProxy<TObject>(path: string[] = []): PathProxy<TObject> {
|
|
|
1930
1645
|
* @param tableOrView - TableBuilder 또는 ViewBuilder 인스턴스
|
|
1931
1646
|
* @param as - Alias 지정 (선택, 미지정 시 자동 생성)
|
|
1932
1647
|
* @returns Queryable을 반환하는 factory 함수
|
|
1933
|
-
*
|
|
1934
|
-
* @example
|
|
1935
|
-
* ```typescript
|
|
1936
|
-
* class AppDbContext extends DbContext {
|
|
1937
|
-
* // 호출할 때마다 새 alias가 할당됨
|
|
1938
|
-
* user = queryable(this, User);
|
|
1939
|
-
*
|
|
1940
|
-
* // 사용 예시
|
|
1941
|
-
* async getActiveUsers() {
|
|
1942
|
-
* return this.user()
|
|
1943
|
-
* .where((u) => [expr.eq(u.isActive, true)])
|
|
1944
|
-
* .execute();
|
|
1945
|
-
* }
|
|
1946
|
-
* }
|
|
1947
|
-
* ```
|
|
1948
1648
|
*/
|
|
1949
1649
|
export function queryable<TBuilder extends TableBuilder<any, any, any> | ViewBuilder<any, any, any>>(
|
|
1950
1650
|
db: DbContextBase,
|