UpgradeUpgrade 应该怎么写packages/apipackages/clientpackages/corepackages/@buildingai/*migration -> Upgrade -> data/versions/<version>packages/api/src/core/database/services/database-init.service.tspackages/api/src/core/database/services/version-manager.service.ts如果这次改动可以描述成“数据库 schema 变了”,就写 migration。Upgrade。如果这次改动依赖“读取已有数据后再处理”,就写 Upgrade。status:status 补成合理值packages/@buildingai/db/src/migrations/packages/@buildingai/db/dist/migrations/{timestamp}-{version}-{description}.js1776000000000-26.1.0-add-report-table.tspackages/@buildingai/db/src/migrations/1765088629599-25.1.0-add-member.tspackages/@buildingai/db/src/migrations/1774943726484-26.0.0-upgrade.ts@buildingai/db 里已经提供了生成命令。src/migrations/ 下创建文件.env 已配置数据库连接Upgrade 归 @buildingai/upgrade 包管理。packages/@buildingai/upgrade/src/scripts/<version>/index.tspackages/@buildingai/upgrade/src/scripts/26.1.0/index.tspackages/@buildingai/upgrade/src/scripts/26.1.0.tsscripts/<version>/index.jsUpgrade:需要你按约定目录手工新建文件BaseUpgradeScript。import { BaseUpgradeScript, UpgradeContext } from "../../index";
export class Upgrade extends BaseUpgradeScript {
readonly version = "26.1.0";
async execute(context: UpgradeContext): Promise<void> {
this.log("Start upgrading data for 26.1.0");
const { dataSource } = context;
await dataSource.query(`
UPDATE report
SET summary = ''
WHERE summary IS NULL
`);
this.success("Upgrade finished");
}
}
export default Upgrade;Upgradeexecute(context)version 要和目录版本一致export default Upgradepackages/@buildingai/upgrade/src/index.tsexecute(context) 里最核心的是 context.dataSource。await context.dataSource.query(
`
UPDATE "config"
SET value = $1
WHERE key = $2
`,
[JSON.stringify({ enabled: true }), "site_settings"],
);const repo = context.dataSource.getRepository("User");
const users = await repo.find({
where: { status: "active" },
});
for (const user of users) {
user.nickname = user.nickname || user.username;
}
await repo.save(users);dataSource.managerconst manager = context.dataSource.manager;
const items = await manager.find("Config", {
where: { group: "system" },
});const queryRunner = context.dataSource.createQueryRunner();
await queryRunner.connect();
await queryRunner.startTransaction();
try {
await queryRunner.query(`
UPDATE "report"
SET "status" = 'ready'
WHERE "status" IS NULL
`);
await queryRunner.query(`
INSERT INTO "audit_log" ("action")
VALUES ('upgrade-26.1.0')
`);
await queryRunner.commitTransaction();
} catch (error) {
await queryRunner.rollbackTransaction();
throw error;
} finally {
await queryRunner.release();
}| 场景 | 应该写什么 |
|---|---|
| 新增表、字段、索引 | migration |
| 把旧字段数据迁移到新字段 | migration + Upgrade |
| 给旧数据补默认值 | Upgrade |
| 清理脏数据 | Upgrade |
| 初始化新版本系统配置 | Upgrade |
| 纯前端改动 | 都不用 |
UPDATE ... WHERE target IS NULLINSERT 前先查是否已存在migration -> UpgradeUpgrade,后面维护会很乱。package.json.version@buildingai/db 构建产物里的 migration@buildingai/upgrade 构建产物里的脚本data/versions/<current-version> 是否存在UpgradeUpgrade,没改版本号Upgrade。Upgrade 写得不可重复执行Upgradepnpm builddata/versions/<version> 已写入UpgradeUpgradeUpgrade 没有,需要手工创建