NestJS/TypeORM多数据库问题:无法访问第二个数据库
NestJS + TypeORM 多数据库访问问题解决
问题根源
- 第二个数据源未在NestJS模块体系中注册,框架无法识别,导致注入的始终是默认数据源
@InjectDataSource(secondDataSource)用法错误,需使用数据源注册时的名称标识,而非直接传入实例- 实体未与对应数据源绑定,Repository默认关联到第一个数据库
分步解决方案
1. 在AppModule中注册第二个数据源
修改app.module.ts,为第二个数据源指定唯一名称,完成框架注册:
import { Module } from '@nestjs/common'; import { ConfigModule, ConfigService } from '@nestjs/config'; import { TypeOrmModule } from '@nestjs/typeorm'; import { TchiaModule } from './tchia/tchia.module'; import { TfachisaModule } from './tfachisa/tfachisa.module'; @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true, envFilePath: `.env.${process.env.NODE_ENV}` }), // 默认数据源(第一个数据库) TypeOrmModule.forRootAsync({ imports:[ConfigModule], useFactory: (configService: ConfigService) => ({ type: 'mysql', host: configService.get('DB_HOST'), port: configService.get('DB_PORT'), username: configService.get('DB_USERNAME'), password: configService.get('DB_PASSWORD'), database: configService.get('DB_NAME'), autoLoadEntities: true }), inject:[ConfigService], }), // 第二个数据源,指定名称标识 TypeOrmModule.forRootAsync({ name: 'secondDataSource', imports:[ConfigModule], useFactory: (configService: ConfigService) => ({ type: 'mysql', host: configService.get('DB_HOST2'), port: parseInt(configService.get('DB_PORT2')), username: configService.get('DB_USERNAME2'), password: configService.get('DB_PASSWORD2'), database: configService.get('DB_NAME2'), synchronize: false, dropSchema: false, logging: false, entities: ["./src/tfachisa/entities/*.entity.ts"], // 仅关联当前数据库的实体 migrations: ["migrations/*$yarn_config_pruebatestS.ts"] }), inject:[ConfigService], }), TchiaModule, TfachisaModule, ], controllers: [], providers: [], }) export class AppModule { }
2. 绑定实体到第二个数据源
修改tfachisa.module.ts,将实体与指定数据源关联:
import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { TfachisaService } from './tfachisa.service'; import { Tfachisa } from './entities/tfachisa.entity'; @Module({ imports: [ TypeOrmModule.forFeature([Tfachisa], 'secondDataSource') // 指定使用第二个数据源 ], providers: [TfachisaService] }) export class TfachisaModule { }
3. 修正Service中的注入逻辑
通过数据源名称注入,确保Repository和DataSource都关联到第二个数据库:
import { Injectable } from '@nestjs/common'; import { InjectDataSource, InjectRepository } from '@nestjs/typeorm'; import { Tfachisa } from './entities/tfachisa.entity'; import { DataSource, Repository } from 'typeorm'; @Injectable() export class TfachisaService { constructor( // 关联到第二个数据源的Repository @InjectRepository(Tfachisa, 'secondDataSource') private readonly tfachisaRepository: Repository<Tfachisa>, // 通过名称注入第二个数据源 @InjectDataSource('secondDataSource') private readonly secondDataSource: DataSource ){} async findAll() { // 两种方式都可访问第二个数据库 const repoData = await this.tfachisaRepository.find(); console.log(repoData); const queryData = await this.secondDataSource.query('SELECT * FROM tchia'); console.log(queryData); } }
额外注意事项
- 确认
.env文件中DB_HOST2、DB_PORT2等配置项准确无误 - 实体路径需精准,避免跨数据源的实体被重复加载
- 迁移配置需与对应数据源绑定,防止影响默认数据库
内容的提问来源于stack exchange,提问作者Yisus_Dra
相关产品推荐
相关产品推荐

