BuildingAI 帮助文档
BuildingAI 官网
  1. 应用开发
  • 欢迎使用 BuildingAI
  • 演示环境
  • 用户社群
  • 企业版咨询
  • 产品线路图
  • 更新日志
  • API 赞助商
  • 积分获取方式
  • 应用安装教程「必看」
  • 使用教程
    • 快速使用
      • 对话
      • 智能体
      • 知识库
      • 工作流
      • MCP 服务
      • 登录配置
      • 密钥配置
      • 模型计费
      • 积分充值
      • 会员订阅
      • 卡密兑换
      • DIY装修
    • 常见配置教程
      • 微信支付配置
      • 支付宝支付配置
      • 微信公众号配置
      • OSS存储配置
      • 短信配置
      • 谷歌登录配置
      • Ollama配置
    • 应用插件配置教程
      • 香蕉绘画Pro版-Nano banana
      • wan2.6漫剧
      • GEO优化排名工具
      • 小红薯热门内容创作助手
      • 即梦AI绘画&视频
      • 一键生成像素动画
      • 反推提示词助手
      • AI 证件照 | 自定义背景色
      • 电商试衣换装-AI模特
    • 大模型申请教程
      • 即梦AI密钥-申请教程
      • 豆包大模型-申请教程
      • 通义千问-申请教程
    • 老版本教程
      • 功能使用教程
      • 智能体
      • MCP工具
      • DIY中心
  • 部署教程
    • 宝塔面板部署
    • Windows 环境下 Docker 部署
    • Docker方式安装
  • 开发文档
    • 网络接口
      • 登录注册
        • 账号密码登录
        • 账号密码注册
      • 前台
        • 文件上传/下载
          • 单个上传
          • 多个上传
          • 列表
          • 详情
          • 下载
          • 删除
        • 用户
          • 算力明细
          • 登录配置
        • AI聊天
          • 对话(非流式)
          • 流式对话
          • 对话记录
          • 对话详情
          • 修改记录
          • 删除记录
          • 获取记录对话
        • MCP
          • 列表
          • 所有记录
          • 详情:id
          • 创建
          • 修改
          • 可见状态
          • 添加
          • 关联详情
          • 系统MCP
          • json导入
          • 移除
          • 删除
          • 获取快捷菜单
          • 系统MCP详情:id
          • 连通性
          • 批量连通性
        • 充值中心
          • 充值中心
          • 充值提交订单
          • 充值记录
          • 预支付
          • 获取支付结果
        • 模型厂商
          • 列表
          • 详情:id
          • 详情:code
        • AI模型
          • 列表
          • 详情:id
          • 默认模型
        • 数据分析
          • 数据记录
        • 会员中心
          • 会员中心信息
          • 获取套餐列表
          • 预支付
          • 订阅提交订单
      • 后台
        • 工作空间
          • MCP
            • 列表
            • 详情
            • 创建
            • 修改
            • 删除
            • 批量删除
            • 启用状态
            • json导入
            • 连通性
            • 批量连通性
            • 获取快捷菜单
            • 设置快捷菜单
          • AI模型
            • 厂商管理
              • 列表
              • 新增
              • 详情:id
              • 详情:provider
              • 修改
              • 删除
              • 状态
            • 模型管理
              • 列表
              • 新增
              • 详情:id
              • 修改
              • 删除:id
              • 批量删除
              • 设为默认
              • 模型类型
              • 模型支持能力
              • 父级模型类型
          • AI知识库
            • 知识库列表
            • 知识库详情
            • 转移知识库
            • 知识库删除
            • 知识库文档列表
            • 知识库文档详情
            • 知识库文档删除
            • 知识库分段列表
            • 知识库分段详情
            • 知识库分段删除
            • 数据列表接口
          • AI智能体
            • 智能体创建
            • 智能体列表
            • 智能体详情
            • 智能体对话记录列表
            • 智能体对话记录详情
            • 智能体对话
            • 智能体发布API接口对话
            • 智能体发布API获取对话列表
            • 智能体发布API获取对话消息
            • 智能体发布API更新对话
            • 智能体发布API删除对话
          • 密钥管理
            • 密钥模板
              • 列表
              • 全部列表
              • 详情
              • 创建
              • 修改
              • 删除
              • 批量删除
              • 修改状态
              • json导入
            • 密钥配置
              • 列表
              • 列表:templateId
              • 创建
              • 统计
              • 详情
              • 完整详情
              • 修改
              • 修改状态
              • 删除
              • 批量删除
        • 用户管理
          • 列表
          • 创建
          • 详情:id
          • 删除
          • 批量删除
          • 重置密码
          • 更新状态
          • 重置随机密码
          • 登录设置
          • 登录设置
        • 角色管理
          • 创建
          • 详情:id
          • 修改
          • 删除
          • 列表
        • 菜单管理
          • 创建
          • 详情:id
          • 修改
          • 删除
          • 列表
        • 插件管理
          • 我的插件
            • 列表
            • 修改
            • 详情:id
            • 创建
            • 启用列表
            • 批量删除
            • 删除:id
            • 批量状态
            • 禁用:id
            • 启用:id
            • 是否存在:identifier
            • 详情:identifier
            • 入库插件详情:identifier
            • 本地列表
            • 类型列表
            • 版本列表:identifier
            • 安装
            • 卸载
          • 插件操作
            • 下载
            • 安装
          • 平台密钥
            • 获取开发者密钥
            • 设置开发者密钥
        • 权限管理
          • 列表
          • 扫描权限
          • 同步到库
          • 扫描接口
          • 清理废弃权限
          • 详情:code
        • 字典配置
          • 列表
        • 系统操作
          • 支付配置
            • 列表
            • 详情:id
            • 状态
            • 更新
          • 系统信息
            • 安装状态
            • 安装状态
          • pm2
            • 进程列表
            • 日志
            • 重启
            • 重载
            • 停止进程
            • 进程详情
            • 进程状态
            • 清空日志
            • 保存进程
            • 健康检查
            • 删除进程
        • 套餐充值
          • 获取套餐充值配置
          • 获取套餐充值配置 Copy
        • 财务
          • 财务中心
          • 用户余额明细
        • 订单管理
          • 充值订单列表
          • 充值订单详情
          • 充值订单退款
          • 会员订单列表
        • 渠道管理
          • 公众号配置
            • 详情
            • 修改
        • 数据分析
          • 数据看板
        • VIP 会员
          • 会员等级
            • 新增会员等级
            • 会员等级列表
            • 修改会员等级
            • 会员等级详情
            • 删除会员等级
          • 订阅计划
            • 新增订阅计划
            • 订阅计划设置
            • 设置会员功能状态
            • 更改订阅计划状态
            • 订阅计划详情
            • 修改订阅计划
            • 删除订阅计划
            • 更新订阅计划排序
      • 插件
        • 文章插件
          • 前台
            • 列表
          • 后台
            • 文章
              • 列表
              • 创建
            • 分类
              • 列表
              • 创建
        • 智能体-企业微信插件
          • 对话接口
        • 配图大师
          • 后台
            • 配图记录
            • 获取配图插件
            • 插件设置
    • 插件与框架开发
      • 技术规范
      • 前置准备
      • 本地部署与开发
      • 目录结构
      • 项目配置
      • 主程序启动链路
      • 请求处理链路
      • 后端开发约定
      • BaseController 与 BaseService
      • DTO、工具与通用服务
      • 前端开发
      • 主程序计费接入
      • 数据库与实体建议
      • AI SDK 开发文档
      • BuildingAI 升级开发文档
      • 前端组件与工具开发文档
      • 后端工具与封装开发文档
      • 应用开发
        • 介绍
        • 创建应用
        • 模板结构
        • 应用开发
        • 打包发布
        • 插件更新
        • 插件清单文件
        • 插件后端开发
        • 插件前端开发
        • Extension SDK 怎么用
        • 插件计费接入
        • 插件 AI 能力接入建议
        • Seeds、Upgrade 与存储
        • 插件升级开发文档
        • 构建与发布
        • 插件前端组件与工具文档
      • PC 客户端
        • 开发文档
        • 构建文档
  • 设计资源
    • 官方素材库
  • 政策
    • 开源许可
    • 服务条款
    • 隐私政策
  1. 应用开发

插件升级开发文档

本文面向插件二开开发者,重点回答:
插件什么时候需要写 migration
插件什么时候需要写 Upgrade
插件 Upgrade 应该怎么写
有哪些命令可以生成 migration
为什么很多人写了升级代码却不生效
本文适用于:
extensions/<identifier>/

1. 先记住插件升级的基本模型#

插件升级和主程序一样,也是:
migration -> Upgrade -> data/versions/<version>
但插件多一个前提:
你的升级代码必须先被构建到 build 目录,主程序启动时才看得见。
插件升级相关入口:
packages/api/src/core/database/extension-upgrade/extension-upgrade-orchestrator.service.ts
packages/api/src/core/database/extension-upgrade/extension-version-manager.service.ts

2. 插件 migration 和 Upgrade 怎么分#

2.1 什么时候写插件 migration#

只要你改的是插件自己的数据库结构,就写 migration。
典型场景:
插件新增表
插件新增字段
插件修改字段类型
插件新增索引
插件 schema 内的结构变更
一句话判断:
如果你的插件 schema 结构变了,就写 migration。

2.2 什么时候写插件 Upgrade#

只要你改的是插件已有数据的迁移、修复、初始化,就写 Upgrade。
典型场景:
给插件旧数据补默认值
新功能发布后初始化一批默认记录
调整插件配置结构
把旧版本数据搬到新字段/新表
升级时根据已有数据做批量修复
一句话判断:
如果你需要读取旧数据、判断旧状态、再写回去,就写 Upgrade。

2.3 什么场景两者都要写#

比如插件给文章表新增 status 字段,同时要把旧文章统一补成 draft:
1.
migration:先新增字段
2.
Upgrade:再批量修复旧数据

2.4 什么场景通常都不用写#

只改插件前端页面
只改接口返回格式,但不处理存量数据
只改组件样式、文案、交互

3. 插件 migration 写在哪里#

源码目录:
extensions/<identifier>/src/api/db/migrations/
构建后目录:
extensions/<identifier>/build/db/migrations/
升级器识别的文件命名格式:
{timestamp}-{version}-{description}.js
例如:
1776000000000-0.0.3-add-article-status.ts
插件 migration 执行记录会写到统一表:
extensions_migrations_history
这张表会用 extension_identifier 区分不同插件。

4. 插件 migration 有哪些生成命令#

这些命令在 @buildingai/db 包里。
进入目录:

4.1 手工创建插件 migration 模板#

例如:
这个命令会:
1.
在插件的 src/api/db/migrations/ 下创建模板文件
2.
自动带上插件标识和版本信息
3.
需要你自己补 SQL 或 TypeORM 逻辑

4.2 根据插件实体自动生成 migration#

例如:
这个命令会:
1.
读取插件构建后的 entity
2.
和数据库当前 schema 做对比
3.
自动生成 migration
4.
输出到插件的 src/api/db/migrations/
使用前提:
数据库必须是实体文件改动前的数据库
数据库必须可连接
插件实体已经改好
必须先执行过插件 API 构建,否则没有 build/db/entities
也就是通常先跑:

5. 插件 Upgrade 写在哪里#

源码目录:
extensions/<identifier>/src/api/upgrade/<version>/index.ts
构建后目录:
extensions/<identifier>/build/upgrade/<version>/index.js
例如:
extensions/simple-blog/src/api/upgrade/0.0.2/index.ts
模板和示例仓库里也已经给了参考:
extensions/simple-blog/src/api/upgrade/0.0.2/index.ts
templates/extension-starter/src/api/upgrade/0.0.2/index.ts

6. 插件 Upgrade 有没有生成命令#

目前没有现成的“生成插件 Upgrade 文件”的脚本。
也就是说:
插件 migration:有生成命令
插件 Upgrade:需要你自己手工创建目录和 index.ts

7. 插件 Upgrade 的最小写法#

插件 Upgrade 的写法比主程序更轻量,一般直接导出 Upgrade 类即可。
示例:
import { DataSource } from "@buildingai/db/typeorm";
import { Logger } from "@nestjs/common";

export class Upgrade {
    private readonly logger = new Logger(Upgrade.name);

    constructor(private readonly dataSource: DataSource) {}

    async execute(): Promise<void> {
        this.logger.log("Start plugin upgrade 0.0.3");

        await this.dataSource.query(`
            UPDATE "simple_blog"."article"
            SET "status" = 'draft'
            WHERE "status" IS NULL
        `);

        this.logger.log("Plugin upgrade 0.0.3 completed");
    }
}
关键点:
1.
文件路径要和版本目录匹配
2.
必须导出 Upgrade 类
3.
类里要有 execute()
4.
构造函数通常接收 DataSource
插件升级器会在运行时执行:
new Upgrade(this.dataSource).execute()

8. 插件 Upgrade 里常用的方法怎么写#

插件 Upgrade 里最常用的是构造函数注入进来的 dataSource。

8.1 直接执行 SQL#

适合:
批量修复插件旧数据
初始化默认记录
清洗历史配置
示例:
await this.dataSource.query(
    `
    UPDATE "simple_blog"."article"
    SET "status" = $1
    WHERE "status" IS NULL
    `,
    ["draft"],
);

8.2 用 Repository#

适合:
插件已经有实体类
想走实体读写
示例:
const repo = this.dataSource.getRepository("Article");
const rows = await repo.find();

for (const row of rows) {
    row.status = row.status || "draft";
}

await repo.save(rows);

8.3 用事务#

如果插件升级逻辑包含多步写操作,建议显式开事务。
示例:
const queryRunner = this.dataSource.createQueryRunner();
await queryRunner.connect();
await queryRunner.startTransaction();

try {
    await queryRunner.query(`
        UPDATE "simple_blog"."article"
        SET "status" = 'draft'
        WHERE "status" IS NULL
    `);

    await queryRunner.query(`
        INSERT INTO "simple_blog"."setting" ("key", "value")
        VALUES ('default_status', 'draft')
    `);

    await queryRunner.commitTransaction();
} catch (error) {
    await queryRunner.rollbackTransaction();
    throw error;
} finally {
    await queryRunner.release();
}

9. 插件开发里最常见的判断题#

场景应该写什么
插件表新增字段migration
插件旧数据补默认值Upgrade
新字段 + 旧数据回填migration + Upgrade
新版本初始化默认配置Upgrade
只改插件页面都不用

10. 插件 Upgrade 设计时的硬规则#

10.1 尽量幂等#

升级失败后主程序重启可能再次执行,所以要尽量做到重复运行不写坏数据。
建议:
UPDATE ... WHERE xxx IS NULL
插入前先查重
已迁移过的数据不要重复迁移

10.2 不要把表结构修改塞进 Upgrade#

表结构变化应该进入 migration。
插件升级器本身就是先跑 migration,再跑 Upgrade。

10.3 升级代码要和插件版本绑定#

插件版本来自:
extensions/<identifier>/package.json
如果你写了 0.0.3 的升级代码,但插件版本还停留在 0.0.2,升级器不会按你预期进入这个版本。

11. 写完以后怎么让插件升级器识别#

插件升级器识别的是构建产物,不是源码目录。
所以写完后至少要执行构建。
常见命令:
如果插件同时有前后端要一起发布,更常用:
之后重启主程序,主程序启动时会:
1.
读取 extensions/extensions.json
2.
找出已启用插件
3.
检查插件 build/ 是否存在
4.
再执行插件 migration 和 Upgrade
所以插件升级不生效时,优先检查这三件事:
1.
插件是否启用
2.
插件是否构建
3.
插件版本是否已提升

12. 插件开发者最容易踩的坑#

12.1 只写了 src/api/upgrade,没重新构建#

主程序只认:
build/upgrade/<version>/index.js

12.2 写了 Upgrade,但没升级插件版本号#

升级器以 package.json.version 为当前目标版本。

12.3 用 migration:generate:extension 前没先构建 API#

这个命令依赖:
build/db/entities
没有构建产物就生成不了。

12.4 把旧数据修复写在 service 正常运行逻辑里#

这会导致:
每次请求都重复修复
数据修复和业务逻辑耦合
后续很难维护
这类逻辑应该放进 Upgrade。

13. 推荐开发流程#

给插件发一个新版本时,推荐顺序:
1.
先判断这次改动是结构变化、数据变化,还是两者都有
2.
结构变化先创建 migration
3.
数据变化再手工创建 src/api/upgrade/<version>/index.ts
4.
提升插件 package.json.version
5.
构建插件
6.
重启主程序验证
7.
确认 extensions/<identifier>/data/versions/<version> 已写入

14. 你可以直接照抄的结论#

改插件表结构:写 migration
改插件历史数据:写 Upgrade
两者都有:两个都写,先 migration 后 Upgrade
插件 migration 有命令生成
插件 Upgrade 没有命令生成,需要手工创建
写完后一定要构建,否则主程序启动时看不到
修改于 2026-04-17 03:33:47
上一页
Seeds、Upgrade 与存储
下一页
构建与发布
Built with