分支管理
RxDB 提供类似 Git 的分支管理能力,让你可以在本地创建多个数据分支,安全地进行实验性修改,然后选择性地合并或切换分支。
快速开始
import { RxDB, SyncType } from '@aiao/rxdb';
const rxdb = new RxDB({
dbName: 'myApp',
entities: [Todo],
sync: { local: { adapter: 'sqlite' }, type: SyncType.None }
});
// 创建分支
await rxdb.versionManager.createBranch('feature-1');
// 切换分支
await rxdb.versionManager.switchBranch('feature-1');
// 删除分支
await rxdb.versionManager.removeBranch('feature-1');
分支管理 API
创建分支
// 从当前状态创建分支
await rxdb.versionManager.createBranch('feature-1');
// 从指定 changeId 创建分支
await rxdb.versionManager.createBranch('feature-2', 12345);
切换分支
await rxdb.versionManager.switchBranch('feature-1');
await rxdb.versionManager.switchBranch('main');
删除分支
await rxdb.versionManager.removeBranch('feature-1');
注意
删除分支会同时删除该分支的所有变更历史。
获取当前分支
import { RxDBBranch } from '@aiao/rxdb';
const currentBranch = await RxDBBranch.findOne({
where: {
combinator: 'and',
rules: [{ field: 'activated', operator: '=', value: true }]
}
});
使用场景
测试新功能
await rxdb.versionManager.createBranch('test-feature');
await rxdb.versionManager.switchBranch('test-feature');
const todo = new Todo();
todo.title = '测试任务';
await todo.save();
// 测试完成,切回主分支
await rxdb.versionManager.switchBranch('main');
await rxdb.versionManager.removeBranch('test-feature');
离线编辑
await rxdb.versionManager.createBranch('offline-work');
await rxdb.versionManager.switchBranch('offline-work');
// 离线修改...
// 恢复网络后切回主分支
await rxdb.versionManager.switchBranch('main');
系统表结构
系统表 RxDBChange 会通过数据库触发器(Trigger) 记录所有数据库的数据变化(插入,修改,删除),RxDBBranch 表会记录当前分支,这样我们就可以通过历史记录来计算出任何时刻的数据,再去修改其他表的数据达到切换版本的需求。
关键字段
RxDBBranch
id: 分支标识符fromChangeId: 分支起始点activated: 是否为当前分支
RxDBChange
id: 变更序号(自增)remoteId: 远程变更IDbranchId: 所属分支type:insert|update|deletepatch: 正向变更(JSON Patch)inversePatch: 逆向变更(用于回滚)revertChangeId: 撤销时的变更IDredoInvalidatedAt: redo 失效时间
分支合并(规划中)
// 合并分支
// await rxdb.versionManager.merge('feature-1', 'main');