文章

【nest】TypeORM数据库迁移脚本配置

一、安装必要依赖

pnpm install --save @nestjs/typeorm typeorm mysql2
pnpm install dotenv -D

二、创建配置文件

// src/config/typeorm.config.ts

import { config } from 'dotenv'
import { DataSource } from 'typeorm'

config()


const dataSource = new DataSource({
    type: 'mysql',
    host: process.env.DB_HOST || '127.0.0.1',
    port: parseInt(process.env.DB_PORT!, 10) || 3306,
    username: process.env.DB_USERNAME || 'root',
    password: process.env.DB_PASSWORD || '',
    database: process.env.DB_DATABASE || 'lin_db',
    entities: [],
    migrations: ['migrations/*.ts'], // 迁移文件路径
    migrationsTableName: 'lin_migrations', // 迁移记录表
    synchronize: false,
});

export default dataSource;

三、创建迁移脚本

迁移命令

// 创建脚本
"migration:create": "typeorm-ts-node-commonjs migration:create",
// 指行脚本
"migration:run": "typeorm-ts-node-commonjs migration:run -d ./src/config/typeorm.config.ts",
// 回滚脚本:回滚最近一次的记录
"migration:revert": "typeorm-ts-node-commonjs migration:revert -d ./src/config/typeorm.config.ts",
// 显示脚本执行情况
"migration:show": "typeorm-ts-node-commonjs migration:show -d ./src/config/typeorm.config.ts"

执行脚本

创建迁移脚本

pnpm run migration:create <path> :pnpm run migration:create migrations/init

执行如上脚本,会在根目录创建一个文件夹名为migrations ,并且在这个文件夹下会存在一个文件名为当前时间戳-init.ts的文件,如下所示,我们需要在这个文件内写迁移脚本:

import { MigrationInterface, QueryRunner } from 'typeorm';

export class Init1764684395382 implements MigrationInterface {
  // 执行脚本
  public async up(queryRunner: QueryRunner): Promise<void> {
    await queryRunner.query(`create table user(
                id int primary key auto_increment,
                username varchar(255) not null unique,
                password varchar(255) not null,
                create_time timestamp not null default current_timestamp,
                update_time timestamp not null default current_timestamp on update current_timestamp,
            )`);
  }

  // 回滚脚本
  public async down(queryRunner: QueryRunner): Promise<void> {
    await queryRunner.query(`drop table user`);
  }
}

创建迁移脚本的另一种方法:

创建bash脚本bin/migration.sh :

#!/bin/bash

if [ -z "$1" ]; then
  echo "错误:请提供迁移文件名称"
  exit 1
fi

mkdir -p migrations

echo "正在创建迁移文件:$1"
pnpm run migration:create ./migrations/$1

echo "迁移文件创建完成!"

给bin/migration.sh脚本赋予执行权限:

chmod +x bin/migration.sh

执行命令bin/migration.sh <文件名> 创建迁移脚本

执行run命令

在创建完如上的迁移文件并且填充好了数据库执行命令之后,就可以执行pnpm run migration:run跑迁移脚本

执行revert命令

如果发现数据库迁移有问题,需要执行pnpm run migration:revert进行回滚

执行show命令

执行pnpm run migration:show命令可以查看执行迁移脚本的情况:

(base) liulin@liulindeMacBook-Pro lin-db-service % p migration:show

> lin-db-service@0.0.1 migration:show /Users/liulin/Desktop/lin-db-service
> typeorm-ts-node-commonjs migration:show -d ./src/config/typeorm.config.ts

[dotenv@17.2.3] injecting env (6) from .env -- tip: ⚙️  write to custom object with { processEnv: myObject }
[X] 2 Init1764684395382
[ ] User1764685303020

总结

经过如上命令,就可以实现TypeORM数据库迁移。

许可协议:  CC BY 4.0