如何用Supabase JS客户端先清空表再批量导入MS Access数据?
问题:Supabase同步数据重复问题及全量替换方案
我在项目中使用Supabase,现有一个ODBC Access数据库从AS400 DB2数据库同步数据,需在Electron应用启动时更新Supabase数据库。目前我使用Supabase的upsert函数实现,但发现有时会产生重复记录,这不符合预期。当前代码如下:
ipcMain.on('startDatabaseUpdate', (event, ...args) => { suppliersdb.query('SELECT * FROM MDB_FANFOR0F_1') .then( (results) => { let count = 0 results.forEach( (result, i) => { count++ if( i === 0 ){ i++ } result.NEMA = result.NEMA.replace('§', '@') // store.supabase.from('Suppliers') .upsert([ { id: i, cod: result.CFOR, name: result.XFOR, cap: result.CCAP, country: result.YLOC, state: result.CPRO, email: result.NEMA } ], { count: 'exact' }).select() .then( (response) => { //console.log(response) }).catch( e => { event.sender.send('databaseUpdateError', e) }) }) // if( count === results.length ){ event.sender.send('databaseUpdateCompleted', { suppliersCount: results.length }) } }).catch( e => { console.log(e) event.sender.send('databaseUpdateError', e) }) })
请问是否可通过Supabase JS客户端提供的函数先清空表中所有数据,再导入Access文件中的更新数据?
解决方案
当然可以,这种全量替换的方式能彻底避免重复记录问题,同时还能优化同步效率,具体实现如下:
1. 核心思路
先清空Supabase目标表的所有数据,再将Access中的数据批量插入,替代原有的循环单条upsert操作。
2. 优化后的完整代码
ipcMain.on('startDatabaseUpdate', async (event, ...args) => { try { // 从Access数据库获取最新数据 const results = await suppliersdb.query('SELECT * FROM MDB_FANFOR0F_1'); // 清空Supabase的Suppliers表(用neq('id', 0)确保全删,避免无条件删除权限限制) await store.supabase.from('Suppliers').delete().neq('id', 0); // 转换数据格式,修正原代码的索引问题 const supplierData = results.map((result, index) => ({ id: index + 1, cod: result.CFOR, name: result.XFOR, cap: result.CCAP, country: result.YLOC, state: result.CPRO, email: result.NEMA.replace('§', '@') })); // 批量插入数据到Supabase const { error } = await store.supabase .from('Suppliers') .insert(supplierData); if (error) throw error; // 通知前端同步完成 event.sender.send('databaseUpdateCompleted', { suppliersCount: results.length }); } catch (e) { console.log(e); event.sender.send('databaseUpdateError', e); } });
3. 关键优化点说明
- 清空表数据:使用
delete().neq('id', 0)替代无条件删除,避免Supabase权限限制(若生产环境允许无条件删除,也可直接用delete())。 - 批量插入:将循环单条请求改为批量插入,大幅提升同步效率,同时避免异步操作顺序混乱。
- 修正索引问题:原代码中
if( i === 0 ){ i++ }会导致索引逻辑混乱,改用index + 1生成id更清晰可靠。 - 异步逻辑修复:使用
async/await确保所有数据库操作完成后再通知前端,避免提前触发完成事件。
4. 注意事项
- 确保Supabase控制台中
Suppliers表的权限配置允许delete和insert操作。 - 若同步数据量极大(上万条),建议分批次插入(比如每1000条一批),避免请求超时。
- 全量替换会丢失表中原有未同步的自定义数据,若有需要保留的数据,需提前做备份或调整同步策略。
内容的提问来源于stack exchange,提问作者OHICT
相关产品推荐
相关产品推荐

