From 80ae0bb6c782019937dd6091247a07c208adfc1b Mon Sep 17 00:00:00 2001 From: wangsijie Date: Wed, 20 Nov 2024 13:28:49 +0800 Subject: [PATCH] fix(schemas): fix init account center alter run in chunks (#6823) --- .../next-1731054001-init-account-center.ts | 36 ++++++++++++++----- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/packages/schemas/alterations/next-1731054001-init-account-center.ts b/packages/schemas/alterations/next-1731054001-init-account-center.ts index d41c756a3..8387a1add 100644 --- a/packages/schemas/alterations/next-1731054001-init-account-center.ts +++ b/packages/schemas/alterations/next-1731054001-init-account-center.ts @@ -4,16 +4,34 @@ import type { AlterationScript } from '../lib/types/alteration.js'; const alteration: AlterationScript = { up: async (pool) => { - const tenants = await pool.many<{ id: string }>(sql` - select id from tenants; - `); - const values = tenants.map((tenant) => sql`(${tenant.id}, 'default')`); + // Process in chunks of 1000 tenants + const batchSize = 1000; + // eslint-disable-next-line @silverhand/fp/no-let + let offset = 0; - // Other fileds have default values so we don't need to set them here - await pool.query(sql` - insert into account_centers (tenant_id, id) - values ${sql.join(values, sql`, `)}; - `); + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition, no-constant-condition + while (true) { + // eslint-disable-next-line no-await-in-loop + const tenants = await pool.any<{ id: string }>(sql` + select id from tenants + order by created_at asc + limit ${batchSize} offset ${offset}; + `); + + if (tenants.length === 0) { + break; + } + + const values = tenants.map((tenant) => sql`(${tenant.id}, 'default')`); + // eslint-disable-next-line no-await-in-loop + await pool.query(sql` + insert into account_centers (tenant_id, id) + values ${sql.join(values, sql`, `)}; + `); + + // eslint-disable-next-line @silverhand/fp/no-mutation + offset += batchSize; + } }, down: async (pool) => { await pool.query(sql`