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

如何在IndexedDB数据库升级时实现对象存储间的数据迁移?

解决IndexedDB升级时数据迁移的问题

你的问题核心出在两个关键点:

  1. upgrade回调使用async/await导致事务异常:版本升级事务是浏览器控制的同步阻塞事务,异步操作会让事务提前终止,无法完成旧数据的读取与迁移。
  2. 版本判断逻辑错误:应该基于oldVersion判断需要执行的升级步骤,而非newVersion——如果用户从版本0直接升级到2,你的原代码会跳过迁移逻辑。

修正后的代码示例

import { openDB } from 'idb';

const testVersion = 2;
const username = 'your-actual-store-name'; // 替换为真实的旧对象存储名称

const db = await openDB('Profile', testVersion, {
  upgrade: (db, oldVersion) => {
    // 初始化版本1的对象存储
    if (oldVersion < 1) {
      db.createObjectStore(username);
    }

    // 从版本1升级到2的迁移逻辑
    if (oldVersion < 2) {
      // 创建新对象存储
      const newStore = db.createObjectStore('profileImage');
      // 获取旧对象存储(版本升级事务允许访问旧存储)
      const oldStore = db.objectStore(username);

      // 读取旧存储数据并迁移
      oldStore.get('profileImage').then(storedData => {
        if (storedData) {
          newStore.put(storedData, username);
        }
        // 迁移完成后删除旧存储
        db.deleteObjectStore(username);
      }).catch(err => {
        console.error('数据迁移失败:', err);
      });
    }
  }
});

关键注意事项

  • 不要将upgrade回调设为async函数:尽管idb库支持Promise,但版本升级事务的生命周期由浏览器管控,异步回调会脱离事务上下文,导致操作失效。
  • 基于oldVersion做增量升级:通过oldVersion < 目标版本的判断,确保从任意旧版本升级时,都会执行对应的迁移步骤。
  • 依托versionchange事务操作:升级过程中浏览器会自动开启versionchange事务,该事务允许同时读写新旧对象存储,无需手动创建额外事务。

内容的提问来源于stack exchange,提问作者MrMamen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 20:30:16