1- import { sql , eq , asc , desc , is } from 'drizzle-orm' ;
1+ import { sql , eq , asc , desc , is , getTableColumns } from 'drizzle-orm' ;
22import { SQL , Table , TableConfig , Column , ColumnBaseConfig , ColumnDataType } from 'drizzle-orm' ;
33import { PgColumn , PgTableWithColumns } from 'drizzle-orm/pg-core' ;
44import { PostgresJsDatabase } from 'drizzle-orm/postgres-js' ;
@@ -58,6 +58,11 @@ export type GenericStreamInput = {
5858 where ?: SQL < unknown > ;
5959}
6060
61+ type GenerateOptions = {
62+ upsert ?: GenerateUpsert ,
63+ upsertTarget ?: PgColumn | Array < PgColumn >
64+ } ;
65+
6166type GenericTable = Table < TableConfig < Column < ColumnBaseConfig < ColumnDataType , string > , object , object > > >
6267 & { enableRLS : ( ) => Omit < PgTableWithColumns < any > , "enableRLS" > ; } ;
6368
@@ -277,6 +282,16 @@ export default class Drizzle<T extends GenericTable> {
277282 await this . pool . delete ( this . generic )
278283 }
279284
285+ async generate (
286+ values : InferInsertModel < T > ,
287+ opts ?: GenerateOptions
288+ ) : Promise < InferSelectModel < T > > ;
289+
290+ async generate (
291+ values : Array < InferInsertModel < T > > ,
292+ opts ?: GenerateOptions
293+ ) : Promise < Array < InferSelectModel < T > > > ;
294+
280295 /**
281296 * Create a new feature
282297 *
@@ -287,11 +302,8 @@ export default class Drizzle<T extends GenericTable> {
287302 */
288303 async generate (
289304 values : InferInsertModel < T > | Array < InferInsertModel < T > > ,
290- opts ?: {
291- upsert ?: GenerateUpsert ,
292- upsertTarget ?: PgColumn | Array < PgColumn >
293- }
294- ) : Promise < InferSelectModel < T > > {
305+ opts ?: GenerateOptions
306+ ) : Promise < InferSelectModel < T > | Array < InferSelectModel < T > > > {
295307 if ( ! opts ) opts = { } ;
296308
297309 let pgres ;
@@ -307,7 +319,7 @@ export default class Drizzle<T extends GenericTable> {
307319 . values ( values )
308320 . onConflictDoUpdate ( {
309321 target : opts . upsertTarget ? opts . upsertTarget : this . requiredPrimaryKey ( ) ,
310- set : values
322+ set : conflictUpdateAll ( this . generic )
311323 } )
312324 . returning ( )
313325 } else {
@@ -340,7 +352,11 @@ export default class Drizzle<T extends GenericTable> {
340352 }
341353 }
342354
343- return pgres [ 0 ] as InferSelectModel < T > ;
355+ if ( Array . isArray ( values ) ) {
356+ return pgres as Array < InferSelectModel < T > > ;
357+ } else {
358+ return pgres [ 0 ] as InferSelectModel < T > ;
359+ }
344360 }
345361
346362 /**
@@ -354,6 +370,22 @@ export default class Drizzle<T extends GenericTable> {
354370 }
355371}
356372
373+ export function conflictUpdateAll <
374+ T extends Table ,
375+ E extends ( keyof T [ '$inferInsert' ] ) [ ] ,
376+ > ( table : T ) {
377+ const columns = getTableColumns ( table )
378+ const updateColumns = Object . entries ( columns )
379+
380+ return updateColumns . reduce (
381+ ( acc , [ colName , table ] ) => ( {
382+ ...acc ,
383+ [ colName ] : sql . raw ( `excluded.${ table . name } ` ) ,
384+ } ) ,
385+ { } ,
386+ ) as Omit < Record < keyof typeof table . $inferInsert , SQL > , E [ number ] >
387+ }
388+
357389export {
358390 Pool
359391}
0 commit comments