【问题标题】:NestJs: Query multiple entities from multiple databaseNestJs:从多个数据库中查询多个实体
【发布时间】:2021-09-23 02:12:48
【问题描述】:

我有 mysql_server_1.database1.users

还有mysql_server_2.database3.users_revenue

  • 如何查询用户的行
  • 如何从 users_revenue 查询行

首先,我已经设置了连接:

const mysql1__database1 = TypeOrmModule.forRootAsync({
  imports: [ConfigModule],
  // @ts-ignore
  useFactory: (configService: ConfigService) => ({
    type: configService.get("DASHBOARD_DB_TYPE"),
    host: configService.get("DASHBOARD_DB_HOST"),
    port: configService.get("DASHBOARD_DB_PORT"),
    username: configService.get("DASHBOARD_DB_USER"),
    password: configService.get("DASHBOARD_DB_PASSWORD"),
    database: configService.get("DASHBOARD_DB_NAME"),
    entities: [__dirname + '/**/*.entity{.ts,.js}'],
    // entities: [User],
    autoLoadEntities: true,
    synchronize: true,
  }),
  inject: [ConfigService],
});

const mysql2__database3 = TypeOrmModule.forRootAsync({
  imports: [ConfigModule],
  // @ts-ignore
  useFactory: (configService: ConfigService) => ({
    name: 'mysql2__database3',
    type: configService.get("DASHBOARD2_DB_TYPE"),
    host: configService.get("DASHBOARD2_DB_HOST"),
    port: configService.get("DASHBOARD2_DB_PORT"),
    username: configService.get("DASHBOARD2_DB_USER"),
    password: configService.get("DASHBOARD2_DB_PASSWORD"),
    database: configService.get("DASHBOARD2_DB_NAME"),
    entities: [__dirname + '/**/*.entity{.ts,.js}'],
    // entities: [User],
    autoLoadEntities: true,
    synchronize: true,
  }),
  inject: [ConfigService],
});

@Module({
  imports: [
    mysql1__database1,
    mysql2__database3,
    StatsModule,
  ],
  controllers: [AppController],
  providers: [AppService, StatsService],
})
export class AppModule {}

user.service.ts

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';

@Injectable()
export class UserService {
  constructor(@InjectRepository(User) private usersRepository: Repository<User>) {}

  async findAll(): Promise<User[]> {
    return await this.usersRepository.find();
  }
}

然后这段代码返回一个空数组,而不是我的数据库中存在这么多行;

const items = await this.userService.findAll();

--- 更新 --- 我看了一下 typeorm 源代码: https://github.com/nestjs/typeorm/blob/8af34889fa7bf14d7dc5541beef1d5c2b50c2609/lib/common/typeorm.decorators.ts#L13

然后https://docs.nestjs.com/techniques/database#multiple-databases

此时,您已经使用自己的连接注册了 User 和 Album 实体。使用此设置,您必须告诉 TypeOrmModule.forFeature() 方法和 @InjectRepository() 装饰器应该使用哪个连接。如果不传递任何连接名称,则使用默认连接。

所以我认为它应该有效?

@InjectRepository(User, 'mysql2_database3')
@Module({
  imports: [
    TypeOrmModule.forFeature([User], "mysql2_database3"),
  ],
  providers: [UserService],
  controllers: [StatsController],
})
export class StatsModule {}

还是报错:

请确保索引 [0] 处的参数 mysql2_database3Connection 在 TypeOrmModule 上下文中可用。

【问题讨论】:

    标签: service entity nestjs typeorm


    【解决方案1】:

    感谢不和谐的@jmc29,他的指导帮助了

    解决办法是:

    const mysql2__database3 = TypeOrmModule.forRootAsync({
      imports: [ConfigModule],
      // @ts-ignore
      useFactory: (configService: ConfigService) => ({
        name: 'mysql2__database3',
        type: configService.get("DASHBOARD2_DB_TYPE"),
        host: configService.get("DASHBOARD2_DB_HOST"),
        port: configService.get("DASHBOARD2_DB_PORT"),
        username: configService.get("DASHBOARD2_DB_USER"),
        password: configService.get("DASHBOARD2_DB_PASSWORD"),
        database: configService.get("DASHBOARD2_DB_NAME"),
        entities: [__dirname + '/**/*.entity{.ts,.js}'],
        autoLoadEntities: true,
        synchronize: true,
      }),
      inject: [ConfigService],
    });
    

    再添加一行:

    const mysql2__database3 = TypeOrmModule.forRootAsync({
    
      name: 'mysql2__database3', // -----> Add this line, it's is required
    
      imports: [ConfigModule],
      // @ts-ignore
      useFactory: (configService: ConfigService) => ({
        name: 'mysql2__database3',
        type: configService.get("DASHBOARD2_DB_TYPE"),
        host: configService.get("DASHBOARD2_DB_HOST"),
        port: configService.get("DASHBOARD2_DB_PORT"),
        username: configService.get("DASHBOARD2_DB_USER"),
        password: configService.get("DASHBOARD2_DB_PASSWORD"),
        database: configService.get("DASHBOARD2_DB_NAME"),
        entities: [__dirname + '/**/*.entity{.ts,.js}'],
        autoLoadEntities: true,
        synchronize: true,
      }),
      inject: [ConfigService],
    });
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多