Skip to content

Commit 31362e6

Browse files
committed
Update CHANGELOG
1 parent e172e2f commit 31362e6

File tree

2 files changed

+44
-8
lines changed

2 files changed

+44
-8
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@
1010

1111
## Version History
1212

13+
### v24.14.0
14+
15+
- :tada: Support returning in generate when submitting array
16+
1317
### v24.13.0
1418

1519
- :tada: Add ability to UPSERT multiple values

generic.ts

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { sql, eq, asc, desc, is } from 'drizzle-orm';
1+
import { sql, eq, asc, desc, is, getTableColumns } from 'drizzle-orm';
22
import { SQL, Table, TableConfig, Column, ColumnBaseConfig, ColumnDataType } from 'drizzle-orm';
33
import { PgColumn, PgTableWithColumns } from 'drizzle-orm/pg-core';
44
import { 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+
6166
type 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+
357389
export {
358390
Pool
359391
}

0 commit comments

Comments
 (0)