TypeORM - 迁移
迁移就像数据库的版本控制。它用于修改和共享应用程序的数据库模式。本节介绍 TypeORM 中的迁移工作原理。
创建新迁移
要创建新迁移,首先我们需要在 ormconfig.json 中设置连接。它定义如下 −
ormconfig.json
"type": "mysql",
"host": "localhost",
"port": 8889,
"username": "root",
"password": "root",
"database": "Library",
"entities": ["entity/*.js"], "migrationsTableName": "student_migration_table", "migrations": ["migration/*.js"], "cli": {
"migrationsDir": "migration"
}
这里,
- migrationsTableName − 它指的是迁移表名称。
- migrations − TypeORM 从给定目录加载迁移。
- cli − 表示迁移将在特定目录内创建。
创建 Book 实体
让我们在 src/entity/Book.ts 中创建一个名为 Book 的实体,如下所示 −
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';
@Entity()
export class Book {
@PrimaryGeneratedColumn()
id: number;
@Column()
title: string;
@Column()
text: string;
}
执行 CLI 创建新迁移
现在,我们可以使用 CLI 执行新迁移,如下所示 −
语法
typeorm migration:create -n <migration-name>
示例
typeorm migration:create -n myMigration
执行上述命令后,您可以看到以下响应 −
Migration /path/to/project/src/migration/1587101104904-myMigration.ts has been generated successfully.
现在,移动到 src/migration/1587101104904-myMigration.ts 文件内部,如下所示。
import {MigrationInterface, QueryRunner} from "typeorm";
export class myMigration1587101104904 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<any> {
}
public async down(queryRunner: QueryRunner): Promise<any> {
}
}
这里,
我们有两个方法 up 和 down。up 方法用于向迁移添加更改,down 方法用于还原迁移中的更改。
让我们在 myMigration.ts 文件中添加 up 方法,如下所示 −
import {MigrationInterface, QueryRunner} from "typeorm";
export class Book1587131893261 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`ALTER TABLE book ADD COLUMN price int`);
}
public async down(queryRunner: QueryRunner): Promise<any> { }
}
这里,
我们在 book 表中添加了一个新列 price。现在,执行 CLI 以添加上述更改。
ts-node ./node_modules/typeorm/cli.js migration:run
上述命令执行迁移并按顺序运行它们。现在,您可以在屏幕上看到以下更改 −
输出
现在打开您的 mysql 服务器,新列已添加。如下所示 −
同样,我们可以将列标题数据类型修改为 varchar(30),如下所示,
import {MigrationInterface, QueryRunner} from "typeorm";
export class Book1587131893261 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`ALTER TABLE book MODIFY COLUMN title varchar(30)`);
}
public async down(queryRunner: QueryRunner): Promise<any> {
}
}
现在,执行相同的命令,您可以进行以下更改 −
ts-node ./node_modules/typeorm/cli.js migration:run
输出
Book 表修改为,
恢复迁移
让我们在 down 方法中添加以下代码来恢复迁移−
import {MigrationInterface, QueryRunner} from "typeorm";
export class Book1587131893261 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<any> {
}
public async down(queryRunner: QueryRunner): Promise<any> {
await queryRunner.query(`ALTER TABLE book drop column price`); // 恢复使用"up"方法所做的操作
}
}
现在,执行以下命令以还原所有更改 −
ts-node ./node_modules/typeorm/cli.js migration:revert
您可以看到以下响应 −
输出
Book 表被修改为,
输出
正如我们在本章中看到的,TypeORM 使编写数据库迁移脚本变得容易。

