数据库 Migration

记录一下最近开发项目时,使用 typeorm + postgresql 开发业务,用版本化的方式来管理数据库结构的变化,这样数据进行更新时才会安全可控,而且还可以回滚迁移。

typeorm 是如何跟踪这些变化的呢,所有的变动都能通过 migrate 的方式记录下来,主要是依赖数据库自身底层的机制,尤其是二进制日志,即 Binary Log,简称 binlog

记录结构变更(DDL): 当执行 CREATE TABLEALTER TABLEDROP TABLE 等数据定义语言(DDL)语句时,都会被 binlog 详细记录下来

记录数据变更(DML): 当执行 INSERTUPDATEDELETE 等数据操作语言(DML)语句时,binlog 也会记录修改前和修改后的数据

我使用 typeorm 来执行这些 migrate,主要有以下几个命令:

"migration:create": "npm run typeorm migration:create"

创建数据库迁移文件

"migration:generate": "npm run typeorm migration:generate -d src/config/database.config.ts"

用于自动生成迁移文件,并生成相应的 SQL 语句

"migration:run": "npm run typeorm migration:run -d src/config/database.config.ts"

用来运行所有没执行的迁移动作,将数据库更新到最新的 Schema 版本

"migration:revert": "npm run typeorm migration:revert -d src/config/database.config.ts"

回退到之前的 Schema,撤销最近一次的数据库变更,类似 git revert 的功能