feat: add batching logic for data insertion
This commit is contained in:
@@ -148,22 +148,13 @@ export async function writeDataToAirtable(
|
|||||||
}
|
}
|
||||||
|
|
||||||
await deleteEmptyRecords(base, tableName);
|
await deleteEmptyRecords(base, tableName);
|
||||||
|
|
||||||
const records = data.map(row => {
|
|
||||||
const validFields = Object.keys(row).filter(field =>
|
|
||||||
existingFields.includes(field) || missingFields.includes(field)
|
|
||||||
);
|
|
||||||
|
|
||||||
const validData: { [key: string]: any } = {};
|
|
||||||
validFields.forEach((field: any) => {
|
|
||||||
validData[field] = row[field];
|
|
||||||
});
|
|
||||||
|
|
||||||
return { fields: validData };
|
|
||||||
});
|
|
||||||
|
|
||||||
await createRecordsWithRetry(base, tableName, records);
|
const BATCH_SIZE = 10;
|
||||||
|
for (let i = 0; i < data.length; i += BATCH_SIZE) {
|
||||||
|
const batch = data.slice(i, i + BATCH_SIZE);
|
||||||
|
await retryableAirtableWrite(base, tableName, batch);
|
||||||
|
}
|
||||||
|
|
||||||
logger.log('info', `Successfully wrote ${data.length} records to Airtable`);
|
logger.log('info', `Successfully wrote ${data.length} records to Airtable`);
|
||||||
});
|
});
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
@@ -200,21 +191,18 @@ async function deleteEmptyRecords(base: Airtable.Base, tableName: string): Promi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function createRecordsWithRetry(
|
async function retryableAirtableWrite(
|
||||||
base: Airtable.Base,
|
base: Airtable.Base,
|
||||||
tableName: string,
|
tableName: string,
|
||||||
records: any[],
|
batch: any[],
|
||||||
retries = MAX_RETRIES
|
retries = MAX_RETRIES
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
try {
|
try {
|
||||||
await base(tableName).create(records);
|
await base(tableName).create(batch.map(row => ({ fields: row })));
|
||||||
} catch (error: any) {
|
} catch (error) {
|
||||||
console.error(`Error creating records: ${error.message}`);
|
|
||||||
|
|
||||||
if (retries > 0) {
|
if (retries > 0) {
|
||||||
await new Promise(resolve => setTimeout(resolve, BASE_API_DELAY));
|
await new Promise(resolve => setTimeout(resolve, BASE_API_DELAY));
|
||||||
console.log(`Retrying create operation, ${retries} attempts remaining`);
|
return retryableAirtableWrite(base, tableName, batch, retries - 1);
|
||||||
return createRecordsWithRetry(base, tableName, records, retries - 1);
|
|
||||||
}
|
}
|
||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user