diff --git a/src/__tests__/query-builder/mutation.test.ts b/src/__tests__/query-builder/mutation.test.ts index dc25746..c498db8 100644 --- a/src/__tests__/query-builder/mutation.test.ts +++ b/src/__tests__/query-builder/mutation.test.ts @@ -49,6 +49,25 @@ describe('QueryBuilder/mutation', () => { expect(result).toEqual(['Alice', 'Bob', 'Charlie']) }) + + it('inserts multiple rows', async () => { + const returning = await new QueryBuilder(client, 'mutation').insert( + [ + { id: 3, name: 'Charlie', metadata: { age: 50 } }, + { id: 4, name: 'David', metadata: { age: 25 } }, + ], + { returning: ['name', 'metadata'] } + ) + + expect(returning).toEqual([ + { name: 'Charlie', metadata: { age: 50 } }, + { name: 'David', metadata: { age: 25 } }, + ]) + + const result = await new QueryBuilder(client, 'mutation').pluck('name') + + expect(result).toEqual(['Alice', 'Bob', 'Charlie', 'David']) + }) }) describe('update', () => { @@ -67,9 +86,7 @@ describe('QueryBuilder/mutation', () => { describe('delete', () => { it('deletes a row', async () => { - await new QueryBuilder(client, 'mutation') - .where('name', 'Alice') - .delete() + await new QueryBuilder(client, 'mutation').where('name', 'Alice').delete() const result = await new QueryBuilder(client, 'mutation').pluck('name') diff --git a/src/query-builder.ts b/src/query-builder.ts index c0c7797..9c01055 100644 --- a/src/query-builder.ts +++ b/src/query-builder.ts @@ -309,8 +309,10 @@ export class QueryBuilder< return result.map((row: any) => row[column]) } - async insert)[] | ['*']>( - values: Partial>, + async insert>, Returning extends (keyof TableType)[] | ['*']>( + values: FirstValue | [FirstValue, ...{ + [K in Extract>]: ColumnValue + }[]], options: { returning?: Returning } = {} ): Promise< Returning extends ['*'] @@ -319,16 +321,16 @@ export class QueryBuilder< ? Pick, Returning[number]> : Record[] > { + const valuesArray = Array.isArray(values) ? values : [values] + const sql = [ 'INSERT INTO', escapeIdentifier(this.table), '(', - Object.keys(values).map(escapeIdentifier).join(','), - ') VALUES (', - Object.values(values) - .map(() => '?') - .join(','), - ')', + Object.keys(valuesArray[0]).map(escapeIdentifier).join(','), + ') VALUES', + + valuesArray.map((v) => `(${Object.keys(v).map(() => '?').join(',')})`).join(',') ] if (options.returning?.length) @@ -339,7 +341,7 @@ export class QueryBuilder< .join(',') ) - return this.client.raw(sql.join(' '), ...Object.values(values)) as any + return this.client.raw(sql.join(' '), ...(valuesArray.map(v => Object.values(v))).flat()) as any } async update)[] | ['*']>(