公司动态

MySQL 系统学习 第五阶段:企业级 MySQL 实战开发 第八章:TypeORM Migration 数据库迁移

📅 2026/7/14 10:22:36
MySQL 系统学习 第五阶段:企业级 MySQL 实战开发 第八章:TypeORM Migration 数据库迁移
一、什么是数据库迁移Migration定义Migration用代码记录数据库结构变化的过程。简单理解数据库版本管理。例如项目开始数据库user id username后来需求增加手机号字段。传统方式开发人员直接执行ALTER TABLE user ADD phone VARCHAR(20);问题谁改的什么时候改的测试环境改了吗生产环境执行了吗不知道。Migration解决把变化记录下来001-create-user.ts 002-add-phone-column.ts 003-add-role-table.ts数据库也有版本历史。二、为什么企业不能手动修改生产数据库这是企业开发非常重要的规范。1. 无法追踪例如生产数据库突然多一个字段phone没人知道谁添加的什么时候添加2. 环境不一致企业通常有开发环境 测试环境 预发布环境 生产环境如果手动修改可能开发有字段phone生产没有导致代码运行失败。3. 无法回滚例如执行ALTER TABLE user DROP COLUMN phone;出现问题。怎么办Migration可以up() 执行修改 down() 恢复三、Migration 和 Entity 的关系很多人容易混淆。Entity描述当前数据库应该是什么样。例如Entity() class User{ Column() phone:string; }Migration描述数据库如何从旧版本变成新版本。关系Entity 表示最终状态 Migration 表示变化过程例如版本1user:id username版本2增加phoneMigration增加phone字段最终Entityphone:string四、Migration 工作流程企业流程修改 Entity ↓ 生成 Migration ↓ 代码审核 ↓ 测试环境执行 ↓ 测试通过 ↓ 生产执行不是修改Entity ↓ 直接启动项目 ↓ 自动改数据库五、TypeORM 开启 Migration配置data-source.ts例如import {DataSource} from typeorm; export const AppDataSource new DataSource({ type:mysql, host:localhost, username:root, password:123456, database:test, entities:[ ./src/**/*.entity.ts ], migrations:[ ./src/migrations/*.ts ] });指定Migration目录。六、创建 Migration命令typeorm migration:create src/migrations/CreateUser生成src └── migrations └── CreateUser.ts内容import { MigrationInterface, QueryRunner } from typeorm; export class CreateUser1700000000000 implements MigrationInterface{ async up( queryRunner:QueryRunner ){ } async down( queryRunner:QueryRunner ){ } }两个核心方法up()执行迁移。例如创建表。down()回滚。恢复以前状态。七、创建表 Migration 示例例如创建 user 表。async up( queryRunner:QueryRunner ){ await queryRunner.query( CREATE TABLE user( id BIGINT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50), create_time DATETIME ) ); }执行后数据库出现user八、回滚 Migrationdownasync down( queryRunner:QueryRunner ){ await queryRunner.query( DROP TABLE user ); }作用撤销刚才的修改。例如执行001 create user之后发现错误。执行revert恢复。九、执行 Migration执行typeorm migration:run数据库会记录已经执行过哪些 Migration。TypeORM 会创建migrations表例如idname1CreateUser2AddPhone避免重复执行。十、回滚 Migration命令typeorm migration:revert效果执行最近一次down()例如当前001 002 003revert回滚003十一、修改字段 Migration 示例需求user增加phone。EntityColumn() phone:string;生成AddPhoneColumnMigrationasync up( queryRunner:QueryRunner ){ await queryRunner.query( ALTER TABLE user ADD phone VARCHAR(20) ); }回滚async down( queryRunner:QueryRunner ){ await queryRunner.query( ALTER TABLE user DROP COLUMN phone ); }十二、自动生成 MigrationTypeORM支持根据 Entity变化生成。命令typeorm migration:generate例如Entity新增phone自动生成ALTER TABLE user ADD phone但是企业中通常需要审核。原因自动生成SQL不一定最优。十三、为什么生产环境不要 synchronize:trueTypeORM有配置synchronize:true作用自动同步表结构。开发环境可以。生产禁止。原因可能删除字段。删除数据。例如Entity删除password字段。启动可能数据库字段被删除。生产推荐synchronize:false使用Migration。十四、企业数据库发布流程真实公司流程第一步开发修改 Entity例如增加订单状态。第二步生成 Migrationmigration:generate第三步代码提交git commit migration文件第四步测试环境执行migration:run第五步测试通过。第六步生产执行migration:run数据库版本同步。十五、Migration 最佳实践1. Migration文件不要修改错误已经上线001-create-user.ts然后修改里面SQL。原因生产记录已经执行。正确新增002-update-user.ts2. 一个业务变更一个Migration例如不要001-big-change.ts里面修改10张表。推荐001-add-user-phone 002-add-order-status 003-create-payment3. Migration需要进入Git因为数据库变化也是代码。4. 生产关闭自动同步必须synchronize:false十六、Entity 与 Migration 对比EntityMigration作用描述当前结构记录变化过程运行时间项目运行部署阶段面向开发代码数据库版本是否修改数据库否是是否提交Git是是十七、本章总结核心Entity 告诉程序 现在数据库应该是什么样 Migration 告诉数据库 如何一步步变成现在这样企业规范✅ 不手改生产数据库✅ 不开启 synchronize✅ 所有结构变化走 Migration✅ Migration进入Git✅ 生产执行 migration:run本章一句话总结Entity 管理代码模型Migration 管理数据库生命周期。企业项目中数据库结构变化必须可追踪、可回滚、可发布。