当前位置: 首页 > 知识库问答 >
问题:

NestJs:从多个数据库查询多个实体

陈霄
2023-03-14

我有mysql_服务器_1。数据库1。使用者

和mysql_服务器_2。数据库3。用户收入

  • 如何查询用户的行
  • 如何从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 {}

使用者服务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-数据库

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

所以我认为它应该起作用?

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

仍然有错误:

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

共有1个答案

赵永新
2023-03-14

感谢@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],
});

再添加一行:

js prettyprint-override">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],
});

 类似资料:
  • 问题内容: 我在各自的数据库中都有WordPress实例。要进行更新,我需要查询所有活动插件,这些插件存储在表“ wp_options”中,可通过以下方式访问 如何访问 所有 活动的插件设置(分布在多个数据库中)并将其输出到一个SQL结果中?我知道语法,但是如何使用上面的语句从那里继续? 单个数据库中的请求如下所示: 问题答案:

  • 问题内容: 我想知道以下内容: 如何从数据库中的多个表中获取数据? 有哪些类型的方法可以做到这一点? 什么是联接和工会,它们之间有何不同? 什么时候应该使用每个与其他比较? 我打算在我的应用程序(例如,PHP)中使用此功能,但是不想对数据库运行多个查询,我需要在单个查询中从多个表中获取数据的哪些选项? 注意:我正在写这篇文章是因为我希望能够链接到有关我在PHP队列中不断遇到的众多问题的书面指南,因

  • 我找不到连接多个db和链sql查询的方法, 如何使用原始mysql语法? 如何使用拉威尔方法?

  • 问题内容: 从PHP 5.3版开始,已对驱动程序进行了补充。它引入了对多个查询的支持。 但是,如果传递了多个查询,我无法弄清楚如何获得两个结果集。这两个查询都已执行,不可能是第二个查询刚刚被转储。 返回值: 问题答案: 原来,您需要使用。 这将返回第二个查询的结果。 这是一个有点奇怪的实现。如果多查询语句仅将两个结果集返回在一个数组下,那肯定会更容易。但是,优点是此实现允许使用不同的FETCH样式

  • 然而,在有些情况下的应用程序有一个library或子项目也使用DBFlow来管理其数据库时候。这是一个重要的方案,因为它可以让你在用多个应用程序中重复使的数据库。此前,DBFlow不支持这种用例,并试图这样做的时候会失败。 为了解决这个问题,你必须确保数据库的module被加载。幸运的是,这是一个非常简单的过程。 for KAPT: 通过传递,再把它添加到创建 模块。 最后,指示DBFlow加载包

  • 问题内容: 我有一个Redis实例,其中有两个数据库。现在,我想设置第二个实例并复制第一个实例,但是第二个实例应该仅具有一个数据库,并且仅复制第一个实例中的db 0。当我尝试执行此操作(为第二个实例设置)时,我在Redis日志文件中收到以下错误消息: 我尝试使用redis-dump,但是尝试将生成的转储导入新实例时出现错误。(我认为与2 dbs和1 db无关,而是redis-dump中的一个错误,