模块数据版本

2018-11-22 08:37:23

模块一般都有与业务相关的数据架构,比如模块test-todo有一个业务数据表testTodo,包含若干字段

当模块编译并部署发布后,模块当前的数据版本建议处于封闭状态。如果有新的数据架构变更,需要递增数据版本。这样,随着模块的升级,模块内部的数据架构也将自动无缝升级

定义数据版本

在模块的package.json文件中配置fileVersion为当前数据版本

{
  "name": "egg-born-module-aa-module1",
  "version": "0.0.1",
  "eggBornModule": {
    "fileVersion": 1
  }
}

后端API路由

需要实现以下API路由,在数据版本升级时由系统自动调用

// version
{ method: 'post', path: 'version/update', controller: version, middlewares: 'inner' },
{ method: 'post', path: 'version/init', controller: version, middlewares: 'inner' },
{ method: 'post', path: 'version/test', controller: version, middlewares: 'test' },
名称 说明
middlewares: ‘inner’ 中间件inner,只允许内部调用
middlewares: ‘test’ 中间件test,只允许在测试环境调用
version/update 多实例无关的数据架构变更
version/init 多实例相关的数据架构变更
version/test 仅在测试环境执行,进行与测试相关的数据初始化工作,比如为后续的单元测试提供初始测试数据初始角色授权

version/updateversion/init的区别

  1. EggBorn启动一个服务,可以支持多个实例运行。实例共享数据表结构,但运行中产生的数据是相互隔离的
  2. update处理与多实例无关的数据架构变更,如创建业务数据表testTodo,以及视图、存储过程、函数、索引等一系列数据架构
  3. init处理与多实例相关的数据架构变更,如添加角色的功能授权菜单授权原子授权

后端代码

src/module/test-todo/backend/src/service/version.js

module.exports = app => {

  class Version extends app.Service {

    async update(options) {
      if (options.version === 1) {
        ...
      }
      // if current fileVersion=2
      if (options.version === 2) {
        ...
      }
    }

    async init(options) {
      if (options.version === 1) {
        ...
      }
      // if current fileVersion=2
      if (options.version === 2) {
        ...
      }
    }

    async test() {
    }

  }

  return Version;
};

名称 说明
options.version 只需针对不同的模块数据版本执行相应的变更逻辑,系统会根据当前数据版本的变动自动调用


评论: