前置准备
安装 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
看到如下内容则表示本地实体与数据库一致没有改动!
我们可以修改下数据库实体再看下,这里修改 logs.entity.ts
文件增加三个字段
再次执行 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
输出如下表示成功,可以看到文件正确输出到了指定的目录下
我们来看一下这个文件的内容,up
方法用于执行数据库模式向前迁移的逻辑、down
方法用于执行数据库模式回滚的逻辑
执行迁移
我们先来看一下数据库 logs
表目前是什么样的,可以看到是没有 createdAt、updatedAt、deletedAt
字段的
执行 npm run migration:run
会执行所有未执行的迁移
等同于 typeorm migration:run -- -d 数据库配置文件即 ./ormConfig.ts
执行后输出如下:
让我们来看下数据库现在的 logs
表,可以看到字段已经增加了
回滚迁移
执行的时候可以把所有未执行的迁移一起执行,但是回滚要一次一次来
执行 npm run migration:revert
输出如下
我们再来看下数据的 logs
表,可以看到恢复到了迁移前的样子
总结
本文实践了nestjs 使用 typeOrm 对数据库的变动进行迁移,当然这是一个简单的例子
在实际的开发过程中数据库的迁移远比这个要复杂的多