From bcff53f38991f8479e02a7012c6829c6f260e34f Mon Sep 17 00:00:00 2001 From: Aman Date: Sat, 26 Jul 2025 21:16:26 +0530 Subject: [PATCH 1/2] add createBulkInsert helper for bulk insert SQL generation --- __tests__/bulkInsert.test.ts | 15 +++++++++++++++ src/bulkInsert.ts | 13 +++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 __tests__/bulkInsert.test.ts create mode 100644 src/bulkInsert.ts diff --git a/__tests__/bulkInsert.test.ts b/__tests__/bulkInsert.test.ts new file mode 100644 index 0000000..48d67b5 --- /dev/null +++ b/__tests__/bulkInsert.test.ts @@ -0,0 +1,15 @@ +import { createBulkInsert } from '../src/bulkInsert' + +describe('createBulkInsert', () => { + it('creates SQL and params for bulk insert', () => { + const baseSql = 'INSERT INTO x VALUES' + const rows = [ [1, 2, 3], [4, 5, 6] ] + const { sql, params } = createBulkInsert(baseSql, rows) + expect(sql).toBe('INSERT INTO x VALUES (?, ?, ?), (?, ?, ?)') + expect(params).toEqual([1, 2, 3, 4, 5, 6]) + }) + + it('throws if no rows', () => { + expect(() => createBulkInsert('INSERT INTO x VALUES', [])).toThrow('No rows provided') + }) +}) diff --git a/src/bulkInsert.ts b/src/bulkInsert.ts new file mode 100644 index 0000000..f8c6549 --- /dev/null +++ b/src/bulkInsert.ts @@ -0,0 +1,13 @@ +/** + * Helper to create bulk insert SQL and parameters. + * @param baseSql The base SQL, e.g. "INSERT INTO x VALUES" + * @param rows Array of rows, e.g. [[1,2,3],[4,5,6]] + * @returns { sql: string, params: any[] } + */ +export function createBulkInsert(baseSql: string, rows: any[][]) { + if (!rows.length) throw new Error('No rows provided') + const placeholders = rows.map(row => `(${row.map(() => '?').join(', ')})`).join(', ') + const sql = `${baseSql} ${placeholders}` + const params = rows.flat() + return { sql, params } +} From 81ceb314369cf2ba2a814a661ffe27e8562fa6be Mon Sep 17 00:00:00 2001 From: Aman Patel Date: Tue, 29 Jul 2025 11:53:55 +0530 Subject: [PATCH 2/2] feat: added createBulkInsert helper for bulk insert SQL generation --- .gitignore | 5 +++++ README.md | 22 ++++++++++++++++++++++ __tests__/bulkInsert.test.ts | 5 ++++- package.json | 1 + src/bulkInsert.ts | 4 +++- 5 files changed, 35 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 6704566..0f0b7ac 100644 --- a/.gitignore +++ b/.gitignore @@ -102,3 +102,8 @@ dist # TernJS port file .tern-port + +.yarn/ +.pnp.* +yarn.lock +node_modules/ diff --git a/README.md b/README.md index 385f6ca..2943c4a 100644 --- a/README.md +++ b/README.md @@ -207,6 +207,28 @@ const arrays = conn.execute(query, [1], { as: 'array' }) // arrays.rows => [['1', '2']] ``` +### Bulk Insert Helper + +You can use the `createBulkInsert` helper to easily construct SQL and parameters for bulk inserts: + +```ts +import { connect } from '@planetscale/database' +import { createBulkInsert } from './src/bulkInsert' + +const conn = connect({ + host: '', + username: '', + password: '' +}) + +const { sql, params } = createBulkInsert( + 'INSERT INTO x VALUES', + [[1, 2, 3], [4, 5, 6]] +) +const result = await conn.execute(sql, params) +console.log(result) +``` + ## Development ```sh diff --git a/__tests__/bulkInsert.test.ts b/__tests__/bulkInsert.test.ts index 48d67b5..4833861 100644 --- a/__tests__/bulkInsert.test.ts +++ b/__tests__/bulkInsert.test.ts @@ -12,4 +12,7 @@ describe('createBulkInsert', () => { it('throws if no rows', () => { expect(() => createBulkInsert('INSERT INTO x VALUES', [])).toThrow('No rows provided') }) -}) +}) + + + diff --git a/package.json b/package.json index 5b61267..79d2b7a 100644 --- a/package.json +++ b/package.json @@ -65,6 +65,7 @@ "eslint-config-prettier": "^8.5.0", "eslint-plugin-prettier": "^5.0.0", "jest": "^29.6.1", + "jest-util": "^30.0.5", "prettier": "^3.0.0", "sqlstring": "^2.3.3", "ts-jest": "^29.1.1", diff --git a/src/bulkInsert.ts b/src/bulkInsert.ts index f8c6549..4fbae29 100644 --- a/src/bulkInsert.ts +++ b/src/bulkInsert.ts @@ -10,4 +10,6 @@ export function createBulkInsert(baseSql: string, rows: any[][]) { const sql = `${baseSql} ${placeholders}` const params = rows.flat() return { sql, params } -} +} + +