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

这里,

我们有两个方法 updownup 方法用于向迁移添加更改,而 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

上述命令执行迁移并按顺序运行它们。现在,您可以在屏幕上看到以下更改:

输出

Executes Migrations

现在打开您的 mysql 服务器,添加了新列。如下所示:

Open Mysql Server

类似地,我们可以将列标题数据类型修改为 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

输出

Command

Book 表被修改为:

Book Table

撤消迁移

让我们在 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

您会看到以下响应:

输出

Response

Book 表被修改为:

输出

Database Migration Script

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

广告