TypeORM项目同时连接MySQL与PostgreSQL多数据库时MySQL无法使用问题
问题根因排查
- 实体注解配置错误
你在@Entity配置中错误使用了database参数,该参数用于指定实际数据库名,不是连接名,你的配置会强制TypeORM去默认PostgreSQL连接下找名为connection2的数据库,自然无法匹配MySQL连接。 - 获取Repository未指定连接名
调用getRepository时如果不传第二个连接名参数,默认会使用名为default的PostgreSQL连接,不会自动关联到MySQL的connection2。 - 连接初始化逻辑存在缺陷
getConnectionOptions不带参数时仅会读取default连接的配置,后续调用createConnections也没有等待异步初始化完成,很容易出现业务代码执行时连接还未建立的问题。
修复步骤
1. 修正Client实体注解
将Client.ts中的@Entity配置修改为如下形式:
// 只需要指定表名,不需要填database参数 @Entity({ name: 'contacts' }) class Client { // 其余原有代码保持不变 }
注:你在ormconfig中已经给
connection2配置了对应实体的扫描路径,只要Client实体放在./src/modules/secondClient/entities/目录下,TypeORM会自动将该实体关联到connection2连接。
2. 修正Repository获取逻辑
修改clientRepository.ts中初始化Repository的代码,明确指定使用connection2连接:
constructor() { // 第二个参数传入MySQL连接的名称 this.repository = getRepository(Client, 'connection2'); }
3. 修正数据库连接初始化逻辑
修改database/index.ts的初始化代码,确保所有连接正常初始化后再启动业务服务:
import { createConnections } from 'typeorm'; // 直接调用createConnections会自动读取ormconfig中所有连接配置 export const initDbConnections = createConnections();
在项目入口文件(如app.ts/main.ts)中等待连接初始化完成后再启动服务:
import { initDbConnections } from './database'; async function bootstrap() { await initDbConnections; // 原有启动服务的逻辑,比如app.listen(3000)等 } bootstrap();
验证方案
修复完成后重启项目,调用Client相关的增删改查接口,检查数据是否正常写入MySQL的second库的contacts表即可。
内容的提问来源于stack exchange,提问作者Bernardo Pieropan
相关产品推荐
相关产品推荐

