对typeorm迁移migrations的简单理解
为了避免线上操作意外,所以要关闭同步功能synchronize: false
而手动操作数据库相关的更新需要的步骤:
-
生成当前数据库实体的快照 作为初始版本的基准
typeorm:create
-
更改相关实体entity后, typeorm:generate自动生成要对数据库进行变更操作的代码文件,同时包含对应回退代码(貌似有个问题,关联外表的名称变更,只会生成新名称的外联表,没有数据,旧表依然存在)
-
typeorm:run执行更新操作
-
typeorm:revert 发现异常,回退版本
按官方教程,踩了一个坑,目前未解决,只能使用曲线方案, 记录一下:
-
主体框架使用ts,编译输出是commonjs,但是typeorm使用
typeorm-ts-node-commonjs
或者typeorm-ts-node-esm
都不行; -
前者报错无法读取orm配置文件,且找不到模块,(原因是无法读取ts文件,配置文件里的datasource能读取,但是内部引用的entity都是ts文件,无法解析,关于路径:理论上能导入就应该能拿到;猜测可能是只解析了配置的ts文件,无法解析内部其他引用的ts文件?)
-
后者报错无法在模块之外导入模块,猜测esm编译方式是静态的,所以内部引用模块未被引用或者是ts文件无法静态解析
所以无奈,干脆让typeorm直接读编译完成后的对应js文件:
-
先 npm run build, 生成打包文件到dist目录
-
直接读取js的orm配置文件 -d dist/ormconfig.js
-
创建和生成文件路径, 依然写在项目原有位置,因为编译后都会到对应dist目录下
"scripts": {
"typeorm": "typeorm-ts-node-commonjs -d dist/ormconfig.js",
"typeorm:create": "typeorm migration:create src/migrations/init",
"typeorm:generate": "npm run typeorm -- migration:generate src/migrations/yy",
"typeorm:run": "npm run typeorm -- migration:run",
"typeorm:revert": "npm run typeorm -- migration:revert"
}
需要注意的是编译前的ormconfig.ts
文件参数里的migrations: ['./src/migrations/*.ts']
,此处是读取迁移初始文件以及生成文件的目录,需要使用dist内ormconfig.js
文件的相对路径,此参数对*.ts
貌似不敏感.
也就是总体步骤: 写好ormconfig文件后,需要先build一次,生成对应js文件;然后create生成初始版本快照, 再更改entity,generate生成更新代码;最后执行run.
后续找到直接读取ts的方案再来更新!