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 - 它指的是迁移表名称。
  • 迁移- TypeORM 从给定目录加载迁移。
  • cli - 指示迁移将在特定目录内创建。

创建图书实体

让我们在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方法用于恢复迁移中的更改。

让我们在myMigration.ts文件中添加方法,如下所示 -

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> { } 
}

这里,

我们在图书表中添加了一个新的价格列。现在,执行 CLI 以添加上述更改。

ts-node ./node_modules/typeorm/cli.js migration:run

上面的命令执行迁移并按顺序运行它们。现在,您可以在屏幕上看到以下变化 -

输出

执行迁移

现在打开你的 mysql 服务器,新列已添加。如下所示 -

打开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

输出

命令

图书表修改为,

书桌

恢复迁移

让我们在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`); // reverts things made in "up" method 
   } 
}

现在,执行以下命令以恢复所有更改 -

ts-node ./node_modules/typeorm/cli.js migration:revert

您可以看到以下响应 -

输出

回复

图书表修改为,

输出

数据库迁移脚本

正如我们在本章中看到的,TypeORM使编写数据库迁移脚本变得很容易。