上个月接了一个改造任务:现有管理系统是基于诺依(RuoYi)的 Nest.js 版本,数据库用 MySQL,客户要求迁移到达梦8,所有功能必须保持原样。我一开始觉得这不算难——换驱动、改连接串、把建表脚本翻译一遍,最多再调调 SQL 语法,一两天应该能搞定。真正动手才发现,Nest.js + TypeORM 这套组合和达梦8之间的摩擦远超预期,从驱动协议、SQL 方言到空字符串语义、标识符大小写,几乎每一层都能踩出问题。
这篇文章把整个改造过程整理成一份可直接对照执行的方案,重点覆盖达梦8实例初始化参数、TypeORM 驱动桥接、诺依核心模块的 SQL 改造以及排错链路。适合正在做诺依/若依系列 Nest.js 项目数据库适配、或者准备把 Nest.js + MySQL 项目迁移到达梦8的同学参考。我会把过程中卡住最久的几个点单独拎出来讲,尽量让读到的人少走弯路。
1. 迁移前的摸底:诺依Nest.js项目里依赖MySQL方言的四个地方
1.1 诺依Nest.js这套项目是怎么用数据库的
诺依这个框架大家应该不陌生,经典的后台管理系统,用户、角色、菜单、部门、字典、参数、日志这些模块全都齐。Nest.js 迁移版基本延续了这套结构,数据库表还是 sys_user、sys_role、sys_menu、sys_dept、sys_dict_data、sys_oper_log 这一批。
在 Nest.js 版里,数据访问层用的是 TypeORM。实体类用 @Entity 装饰器映射表,Service 层通过 Repository 或者 DataSource 执行查询,复杂的业务查询会直接用 QueryBuilder 拼条件。这种方式本身跨数据库能力不错,前提是底层驱动和 SQL 方言兼容。一旦数据库换成达梦8,问题就来了:TypeORM 默认的 mysql 驱动走的是 mysql2 协议,达梦8 根本不认这个协议,这是第一个也是最大的障碍。
需要提前说明的是,达梦8 虽然提供了 MySQL 兼容模式,但它不是把 MySQL 客户端协议搬过来,只是在 SQL 语法层面做了一部分兼容。指望 TypeORM 不改一行代码切过去是不现实的。
1.2 我把MySQL方言依赖分成了四层
改造前我先把项目里所有和 MySQL 强相关的东西扫了一遍,归纳成四层,后面全部围绕这四层展开。
第一层是连接与协议层。Nest.js 项目里的 TypeORM 配置是 type: 'mysql',底层驱动是 mysql2,走的是 MySQL 传输协议
