UpgradeUpgrade 应该怎么写extensions/<identifier>/migration -> Upgrade -> data/versions/<version>你的升级代码必须先被构建到 build 目录,主程序启动时才看得见。packages/api/src/core/database/extension-upgrade/extension-upgrade-orchestrator.service.tspackages/api/src/core/database/extension-upgrade/extension-version-manager.service.ts如果你的插件 schema 结构变了,就写 migration。Upgrade。如果你需要读取旧数据、判断旧状态、再写回去,就写 Upgrade。status 字段,同时要把旧文章统一补成 draft:extensions/<identifier>/src/api/db/migrations/extensions/<identifier>/build/db/migrations/{timestamp}-{version}-{description}.js1776000000000-0.0.3-add-article-status.tsextensions_migrations_historyextension_identifier 区分不同插件。@buildingai/db 包里。src/api/db/migrations/ 下创建模板文件src/api/db/migrations/build/db/entitiesextensions/<identifier>/src/api/upgrade/<version>/index.tsextensions/<identifier>/build/upgrade/<version>/index.jsextensions/simple-blog/src/api/upgrade/0.0.2/index.tsextensions/simple-blog/src/api/upgrade/0.0.2/index.tstemplates/extension-starter/src/api/upgrade/0.0.2/index.tsUpgrade:需要你自己手工创建目录和 index.tsUpgrade 类即可。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");
}
}Upgrade 类execute()DataSourcenew Upgrade(this.dataSource).execute()dataSource。await this.dataSource.query(
`
UPDATE "simple_blog"."article"
SET "status" = $1
WHERE "status" IS NULL
`,
["draft"],
);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);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();
}| 场景 | 应该写什么 |
|---|---|
| 插件表新增字段 | migration |
| 插件旧数据补默认值 | Upgrade |
| 新字段 + 旧数据回填 | migration + Upgrade |
| 新版本初始化默认配置 | Upgrade |
| 只改插件页面 | 都不用 |
UPDATE ... WHERE xxx IS NULLUpgrade。extensions/<identifier>/package.json0.0.3 的升级代码,但插件版本还停留在 0.0.2,升级器不会按你预期进入这个版本。extensions/extensions.jsonbuild/ 是否存在Upgradesrc/api/upgrade,没重新构建build/upgrade/<version>/index.jspackage.json.version 为当前目标版本。migration:generate:extension 前没先构建 APIbuild/db/entitiesUpgrade。src/api/upgrade/<version>/index.tspackage.json.versionextensions/<identifier>/data/versions/<version> 已写入UpgradeUpgradeUpgrade 没有命令生成,需要手工创建