NestJS + MySQL:如何在不设置实体的情况下连接多个数据库

Posted

技术标签:

【中文标题】NestJS + MySQL:如何在不设置实体的情况下连接多个数据库【英文标题】:NestJS + MySQL: how to connect to multiple databases without setting entities 【发布时间】:2019-05-19 00:00:15 【问题描述】:

NestJS documentation about Databases 解释了如何使用 TypeORM 和定义实体连接到 mysql

就我而言,我必须连接到具有多个数据库的 MySQL 服务器,并且我需要直接执行 SQL 查询(不使用实体层)并获取它们的结果。有时我还需要运行跨数据库查询

如何使用NestJS 做到这一点?

【问题讨论】:

参见“多个数据库”部分:docs.nestjs.com/techniques/database。每个连接都有自己的名称,您可以使用 @InjectConnection('name') 将连接实例注入到类中(并且连接具有使您能够执行普通 SQL 查询的方法) @KamilMyśliwiec 谢谢,但我可以在TypeOrmModule 中将一个空数组[] 作为entities 传递吗? 【参考方案1】:

您可以通过给连接不同的名称来导入multiple databases。您可以直接在单独的 TypeOrmModule.forRoot(...) 导入中传递数据库配置,也可以使用 ormconfig.json 配置文件。 (但是,ormconfig.json 文件可能仍然无法与多个数据库一起使用,请参阅此thread。)

TypeOrmModule.forRoot(
  ...defaultOptions,
  name: 'personsConnection',
  ^^^^^^^^^^^^^^^^^^^^^^^^^^
  host:  'person_db_host',
  entities: [Person],
),
TypeOrmModule.forRoot(
  ...defaultOptions,
  name: 'albumsConnection',
  ^^^^^^^^^^^^^^^^^^^^^^^^^
  host:  'album_db_host',
  // You can also leave the entities empty
  entities: [],
)

正如 Kamil 在 cmets 中所述,您可以使用 @InjectConnection('albumsConnection'): Connection 注入 TypeORM connection 对象,然后使用 QueryBuilder 或方法 query 运行原始 SQL。

const rawData = await connection.query(`SELECT * FROM USERS`);

【讨论】:

TypeOrmModule.forRoot() 给了我一个打字稿错误“不能分配给'TypeOrmModuleOptions'类型的参数”,所以我使用了TypeOrmModule.forRootAsync(),一切顺利

以上是关于NestJS + MySQL:如何在不设置实体的情况下连接多个数据库的主要内容,如果未能解决你的问题,请参考以下文章

使用带有 TypeOrm 的 NestJS 连接 MySQL 数据库时出现问题

如何将 NestJS 配置注入 TypeORM 实体?

如何在带有typeorm的nestjs项目中使用外部实体?

NestJS typeorm - 无法创建实体

如何从控制器 JSON 返回的实体字段中排除。 NestJS + Typeorm

带有实体关系的nestjs graphql - 如何装饰它?