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 使编写数据库迁移脚本变得容易。