typeorm的migration部署流程
总体流程:
① 数据库的配置项一份作为TypeOrmModuleOptions给nestjs,还要一份作为DataSourceOptions默认导出给typeorm使用
② package.json文件配置相关命令
命令执行原理:
create 获取当前数据库各实体的初始版本,执行代码为空
generate 当代码对entity的配置有改动时,生成增量的数据库执行代码
run 执行增量代码,对数据库进行操作
revert 恢复上次执行,使数据库回到初始状态
首先配置好orm的导出变量DataSource,以下使用commonjs
// ormconfig.ts文件
import { DataSource, DataSourceOptions } from 'typeorm';
// 引入.env文件的变量合并到node环境中
require('dotenv').config();
export default new DataSource ({
type: 'mysql',
host: process.env.DBHOST,
port: 3306,
username: 'root',
password: process.env.DBPWD,
database: 'xzz222',
entities: allEntities,
migrations: ['src/migrations/*{.ts,.js}'], // 一定要定义目录,npm命令执行时会默认读取
synchronize: false, //生产模式同步一定要关掉,不然小心随时提桶跑路
} as DataSourceOptions)
package.json文件添加migration执行命令
"scripts": {
"build": "nest build",
"start": "nest start",
"start:dev": "nest start --watch",
"start:debug": "nest start --debug --watch",
"start:prod": "node dist/main",
"typeorm": "typeorm-ts-node-commonjs -d src/orm/ormconfig.ts",
"typeorm:create": "typeorm-ts-node-commonjs migration:create src/migrations/init",
"typeorm:generate": "npm run typeorm -- migration:generate src/migrations/generate",
"typeorm:run": "npm run typeorm -- migration:run ",
"typeorm:revert": "npm run typeorm -- migration:revert"
},
对于初次使用,或者初始化当前实体,执行 npm run typeorm:create
或者原始命令 npm run typeorm-ts-node-commonjs migration:create src/migrations/init
注意此处init可以替换成你指定的任意名称
// src/migrations/1693839187644-init.ts
import { MigrationInterface, QueryRunner } from "typeorm"
export class Init1693839187644 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise
public async down(queryRunner: QueryRunner): Promise
}
当有初始文件后,更改entity数据库实体文件内容,比如新增了一项列column,名称testn6,如果synchronize: true,
则保存时会自动修改数据库,而我们设置false,则不会有任何数据库操作,使用 npm run typeorm:generate 命令,
会生成执行数据库表新增列testn6的操作命令,并存储到文件里,但不执行;每次generate都会生成新更改后的命令
// src/migrations/1693839187644-generate.ts
import { MigrationInterface, QueryRunner } from "typeorm"
export class Init1693839187644 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise
await queryRunner.query(ALTER TABLE \
profile` ADD `testn6` varchar(255) NOT NULL); } public async down(queryRunner: QueryRunner): Promise<void> { await queryRunner.query(
ALTER TABLE `profile` DROP COLUMN `testn6``);
}
}
手动执行 npm run typeorm:run, 执行文件里定义好的新增列的操作,操作数据库
当发现误删库,无奈要提桶跑路时,使用 npm run typeorm:revert, 就可以恢复更改的操作,多次revert可以依次恢复历史操作
所以migration本质就是将对数据库的操作命令写入文件当备忘录,作为更新及恢复的依据
待续: 坑 1.更改列名之类的操作可能需要手写执行命令 2. 恢复只能恢复迁移操作,数据依然会丢失