NestJS 使用 TypeORM CLI 高效管理数据库变更

264 阅读3分钟

前置准备

安装 typeorm 可以全局安装 npm i -g typeorm 或者项目内安装 npm i typeorm 均可

本次示例使用项目内安装 npm i typeorm

安装 ts-node nestjs 项目一般已经自动安装了,如果没有则执行 npm install ts-node --save-dev 安装

修改 package.json

在 package.json 的 scripts 部分添加如下内容:

"scripts": {
    ...
     "typeorm": "typeorm-ts-node-commonjs -d ./ormConfig.ts",
    "migration:create": "typeorm-ts-node-commonjs -- migration:create",
    "migration:generate": "npm run typeorm -- migration:generate ./migrations/all",
    "migration:run": "npm run typeorm -- migration:run",
    "migration:revert": "npm run typeorm -- migration:revert"
}

创建 ormConfig.ts

typeorm cli 需要连接到数据库才能知道有哪些变动需要迁移,所以 ormConfig.ts 就是连接数据库的配置文件

具体配置可以直接查看 ts 类型文件或者猛击访问官方文档

执行 pnpm i dotenv 安装 dotenv 用来加载环境变量

env 文件

MYSQL_USER=root
MYSQL_PASSWORD=123456
MYSQL_DATABASE=nest_demo
MYSQL_HOST=localhost
MYSQL_PORT=3306

JWT_SECRET=xxxxxxx

ormConfig.ts

import { DataSource, DataSourceOptions } from 'typeorm';
import * as dotenv from 'dotenv';
import * as path from 'path';

// 1. 设置环境变量指定要加载的配置文件路径
// 默认会加载 .env 文件,这里会加载其他的配置文件如 .env.pro 文件
process.env.DOTENV_CONFIG_PATH = path.resolve(__dirname, '.env');

// 2. 加载并解析指定的配置文件
dotenv.config();

const { MYSQL_HOST, MYSQL_PORT, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE } =
  process.env;

// 这里到处是为了给 app.module.ts 中使用
export const AppDataSourceOptions: DataSourceOptions = {
  type: 'mysql',
  host: MYSQL_HOST,
  port: Number(MYSQL_PORT),
  username: MYSQL_USER,
  password: MYSQL_PASSWORD,
  database: MYSQL_DATABASE,
  entities: [__dirname + '/**/*.entity{.ts,.js}'],
  synchronize: false,
  logging: ['schema', 'query', 'error', 'warn', 'migration'],
  migrations: [__dirname + '/migrations/*{.ts,.js}'],
};

const AppDataSource = new DataSource(AppDataSourceOptions);

export default AppDataSource;

生成迁移文件

执行 npm run migration:generate

看到如下内容则表示本地实体与数据库一致没有改动!

image.png

我们可以修改下数据库实体再看下,这里修改 logs.entity.ts 文件增加三个字段

image.png

再次执行 npm run migration:generate

"migration:generate": "npm run typeorm -- migration:generate ./migrations/all"

./migrations/all 指定了生成迁移文件的存储路径

等同于 npx typeorm-ts-node-commonjs migration:generate -d ./ormConfig.ts ./migrations/all

输出如下表示成功,可以看到文件正确输出到了指定的目录下

image.png

我们来看一下这个文件的内容,up 方法用于执行数据库模式向前迁移的逻辑、down 方法用于执行数据库模式回滚的逻辑

image.png

执行迁移

我们先来看一下数据库 logs 表目前是什么样的,可以看到是没有 createdAt、updatedAt、deletedAt 字段的

image.png

执行 npm run migration:run 会执行所有未执行的迁移

等同于 typeorm migration:run -- -d 数据库配置文件即 ./ormConfig.ts

执行后输出如下:

image.png

让我们来看下数据库现在的 logs 表,可以看到字段已经增加了

image.png

回滚迁移

执行的时候可以把所有未执行的迁移一起执行,但是回滚要一次一次来

执行 npm run migration:revert 输出如下

image.png

我们再来看下数据的 logs 表,可以看到恢复到了迁移前的样子

image.png

总结

本文实践了nestjs 使用 typeOrm 对数据库的变动进行迁移,当然这是一个简单的例子

在实际的开发过程中数据库的迁移远比这个要复杂的多

仓库地址 猛击访问