插件里面该如何写sql的数据迁移脚本,以支持初装及版本升级?

Viewed 62

有些插件写得比较乱,缺乏统一的实践指导。

2 Answers

插件迭代产物需要支持以下两点,这样可以保证每个插件版本都支持初装和升级

  1. 跨版本升级:需要支持任意版本的升级

实现方式:

  • upgrade 方法可以拿到上一个版本的信息,使用 switch case 判断所有的旧版本,每一个版本的逻辑里都需要兼容跨版本升级

因为每一次的迭代都是一个确定的版本,所以开发者可以知道所有旧版本升级到当前版本需要处理的逻辑

示例:

// 升级插件到 2.0 版本(历史版本:1.0、1.1)
export async function Upgrade(oldPluginInfo) {
  const oldVersion = oldPluginInfo.version;

  switch (oldPluginInfo) {
    case "1.0":
      // 从 1.0 升级到 2.0 版本(需要处理中间版本的所有逻辑)
      importSQL("plugin_S2076.sql");
      importSQL("plugin_S2077.sql");
      break;
    case "1.1":
      // 从 1.1 升级到 2.0 版本,因为
      importSQL("plugin_S2077.sql");
      break;
    default:
      break;
  }
}
  1. 每个版本都要能够支持初装

实现方式:

持续维护 install 方法,每一次迭代都需要重新将最新的表结构写到 install

示例:

// 安装插件
export async function Install() {
	// 维护最新的表结构,保证当前版本的代码与初装的表结构兼容
	await importSQL("plugin.sql");
	await importSQL("plugin_S2076.sql");
    await importSQL("plugin_S2077.sql");
}

应该把switch case里面的break去掉,这样版本可以累加。