You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 18:32:52