生成迁移文件
非官方测试版翻译
本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →
TypeORM 能够自动生成迁移文件:通过对比实体变更与服务器上的现有数据库模式。
自动迁移生成会创建新的迁移文件并写入所有必须执行的 SQL 查询。如果未检测到更改,命令将以代码 1 退出。
假设你有一个带 title 列的 Post 实体,现在需要将列名 title 改为 name。
可通过以下命令生成迁移:
typeorm migration:generate -d <path/to/datasource> <migration-name>
-d 参数值需指定 DataSource 实例的路径。
也可通过 --name 参数指定名称:
typeorm migration:generate -- -d <path/to/datasource> --name=<migration-name>
或使用完整路径:
typeorm migration:generate -d <path/to/datasource> <path/to/migrations>/<migration-name>
假设使用 post-refactoring 作为名称,将生成名为 {TIMESTAMP}-post-refactoring.ts 的文件,内容如下:
import { MigrationInterface, QueryRunner } from "typeorm"
export class PostRefactoringTIMESTAMP implements MigrationInterface {
async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(
`ALTER TABLE "post" ALTER COLUMN "title" RENAME TO "name"`,
)
}
async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(
`ALTER TABLE "post" ALTER COLUMN "name" RENAME TO "title"`,
)
}
}
通过 o 标志(--outputJs 别名)可生成 JavaScript 文件(适用于纯 JavaScript 项目)。该命令将生成一个新的迁移文件 {TIMESTAMP}-PostRefactoring.js,其内容如下:
/**
* @typedef {import('typeorm').MigrationInterface} MigrationInterface
* @typedef {import('typeorm').QueryRunner} QueryRunner
*/
/**
* @class
* @implements {MigrationInterface}
*/
module.exports = class PostRefactoringTIMESTAMP {
/**
* @param {QueryRunner} queryRunner
*/
async up(queryRunner) {
await queryRunner.query(
`ALTER TABLE "post" ALTER COLUMN "title" RENAME TO "name"`,
)
}
/**
* @param {QueryRunner} queryRunner
*/
async down(queryRunner) {
await queryRunner.query(
`ALTER TABLE "post" ALTER COLUMN "name" RENAME TO "title"`,
)
}
}
默认情况下,使用 o 标志(--outputJs 的别名)生成 CommonJS JavaScript 代码,但你也可以使用 esm 标志生成 ESM 代码。这对于使用 ESM 的 JavaScript 项目非常有用:
/**
* @typedef {import('typeorm').MigrationInterface} MigrationInterface
* @typedef {import('typeorm').QueryRunner} QueryRunner
*/
/**
* @class
* @implements {MigrationInterface}
*/
export class PostRefactoringTIMESTAMP {
/**
* @param {QueryRunner} queryRunner
*/
async up(queryRunner) {
await queryRunner.query(
`ALTER TABLE "post" ALTER COLUMN "title" RENAME TO "name"`,
)
}
/**
* @param {QueryRunner} queryRunner
*/
async down(queryRunner) {
await queryRunner.query(
`ALTER TABLE "post" ALTER COLUMN "name" RENAME TO "title"`,
)
}
}
可见你无需手动编写查询语句。
迁移生成的基本原则是:每次修改模型后立即生成迁移。使用 p 标志(--pretty 别名)可为生成的迁移查询应用多行格式化。