如何在 NestJS 中使用 TypeORM 实现多数据库连接配置

2024-01-09 00:36

本文主要是介绍如何在 NestJS 中使用 TypeORM 实现多数据库连接配置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

当你打算在一个 NestJS 应用中操作多个数据库时,TypeORM 提供了优雅而强大的解决方案。在本教程中,我们将一步步了解如何在 NestJS 项目中配置 TypeORM 以使用多个数据库。

实现步骤

一、创建 NestJS 项目

如果你还没有一个 NestJS 项目,请使用以下命令创建一个新项目:

nest new multi-database-app

进入项目后,我们准备好基础设施。

二、安装 TypeORM 和数据库驱动

请确保你已安装了 TypeORM 并添加了对你将使用的数据库的支持。例如,如果你使用 MySQL 和 PostgreSQL,则需要安装它们的驱动:

npm install @nestjs/typeorm typeorm mysql pg

三、创建数据库配置文件

在项目的根目录下,创建两个配置文件 ormconfig.mysql.jsonormconfig.postgres.json,用于存放两个不同数据库的配置。

ormconfig.mysql.json 示例:

{"name": "mysqlConnection","type": "mysql","host": "localhost","port": 3306,"username": "your_mysql_username","password": "your_mysql_password","database": "your_mysql_db","entities": ["dist/**/*.entity{.ts,.js}"],"synchronize": true
}

ormconfig.postgres.json 示例:

{"name": "postgresConnection","type": "postgres","host": "localhost","port": 5432,"username": "your_postgres_username","password": "your_postgres_password","database": "your_postgres_db","entities": ["dist/**/*.entity{.ts,.js}"],"synchronize": true
}

确保配置文件对应到正确的数据库和认证信息。entities 配置了实体位置,方便 TypeORM 自动加载。

四、设置多个数据库连接

修改 app.module.ts 来包含多个数据库连接:

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import * as mysqlConfig from './ormconfig.mysql.json';
import * as postgresConfig from './ormconfig.postgres.json';@Module({imports: [TypeOrmModule.forRoot(mysqlConfig),TypeOrmModule.forRoot(postgresConfig)],
})
export class AppModule {}

我们使用 TypeOrmModule.forRoot() 方法两次,分别传入两个数据库的配置。

五、创建数据库实体

根据你的业务需求为每个数据库创建实体类。这里我们假设 MySQl 用于存储 User 实体,而 PostgreSQL 存储 Post 实体。

src 目录下创建 user.entity.ts

import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';@Entity()
export class User {@PrimaryGeneratedColumn()id: number;@Column()name: string;
}

src 目录下创建 post.entity.ts

import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';@Entity()
export class Post {@PrimaryGeneratedColumn()id: number;@Column()title: string;@Column()content: string;
}

确保这些实体类遵循 TypeORM 的装饰器模式进行定义。

六、在服务中注入并使用多个数据库连接

要在服务中使用不同的数据库连接,我们需要为每个数据库创建一个特殊的符号,让 NestJS 可以识别并注入正确的 Repository。

首先,创建两个服务类,users.service.ts(用于操作 MySQL 数据库的 User 实体)和 posts.service.ts(用于操作 PostgreSQL 数据库的 Post 实体)。

  1. UsersService - 使用 MySQL

    src 目录下创建 users.service.ts

    import { Injectable } from '@nestjs/common';
    import { InjectRepository } from '@nestjs/typeorm';
    import { User } from './user.entity';
    import { Repository } from 'typeorm';@Injectable()
    export class UsersService {constructor(@InjectRepository(User, 'mysqlConnection')private readonly userRepository: Repository<User>,) {}// 添加用户的逻辑async createUser(userInfo: CreateUserDto): Promise<User> {const user = this.userRepository.create(userInfo);return this.userRepository.save(user);}// 其他 CRUD 操作...
    }

    这里使用 InjectRepository 装饰器和连接名 mysqlConnection 来注入特定的 Repository。

  2. PostsService - 使用 PostgreSQL

    src 目录下创建 posts.service.ts

    import { Injectable } from '@nestjs/common';
    import { InjectRepository } from '@nestjs/typeorm';
    import { Post } from './post.entity';
    import { Repository } from 'typeorm';@Injectable()
    export class PostsService {constructor(@InjectRepository(Post, 'postgresConnection')private readonly postRepository: Repository<Post>,) {}// 添加文章的逻辑async createPost(postData: CreatePostDto): Promise<Post> {const post = this.postRepository.create(postData);return this.postRepository.save(post);}// 其他 CRUD 操作...
    }

    类似地,这里使用 InjectRepository 装饰器和连接名 postgresConnection 来注入 Post 的 Repository。

七、实现服务逻辑和 CRUD 示例

现在我们已经有了操作两个数据库的服务,我们可以在每个服务类中添加 CRUD 方法,实现数据的增删改查。

  1. 创建 DTOs (Data Transfer Objects)

    对于每个 CRUD 操作,建议使用 DTOs 来传递数据。在 src 目录下创建 create-user.dto.tscreate-post.dto.ts 文件定义 DTOs。

    create-user.dto.ts 示例:

    export class CreateUserDto {readonly name: string;
    }

    create-post.dto.ts 示例:

    export class CreatePostDto {readonly title: string;readonly content: string;
    }
  2. 完成 CRUD 操作

    UsersServicePostsService 服务中定义 CRUD 操作。我们已经为 UsersService 定义了 createUser 方法,现在让我们添加查询所有用户的方法:

    // users.service.tsasync getUsers(): Promise<User[]> {return this.userRepository.find();
    }

    类似地,在 PostsService 添加查询所有文章的方法:

    // posts.service.tsasync getPosts(): Promise<Post[]> {return this.postRepository.find();
    }

结语

现在你已经了解了在 NestJS 应用中使用 TypeORM 设置和操作多个数据库的完整流程。通过上述步骤,你不仅可以连接单一数据库,而且还能够灵活地同步操作多个数据库。

我们鼓励你根据自己的项目需求进一步探索 TypeORM 的高级特性,例如实体关系、事务管理、订阅功能和更多数据持久化的策略,从而充分利用异构数据库环境带来的优势。这将大大提升你的 NestJS 应用程序的可扩展性和健壮性。

这篇关于如何在 NestJS 中使用 TypeORM 实现多数据库连接配置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/585379

相关文章

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

Mysql实现范围分区表(新增、删除、重组、查看)

《Mysql实现范围分区表(新增、删除、重组、查看)》MySQL分区表的四种类型(范围、哈希、列表、键值),主要介绍了范围分区的创建、查询、添加、删除及重组织操作,具有一定的参考价值,感兴趣的可以了解... 目录一、mysql分区表分类二、范围分区(Range Partitioning1、新建分区表:2、分

MySQL 定时新增分区的实现示例

《MySQL定时新增分区的实现示例》本文主要介绍了通过存储过程和定时任务实现MySQL分区的自动创建,解决大数据量下手动维护的繁琐问题,具有一定的参考价值,感兴趣的可以了解一下... mysql创建好分区之后,有时候会需要自动创建分区。比如,一些表数据量非常大,有些数据是热点数据,按照日期分区MululbU

SQL Server配置管理器无法打开的四种解决方法

《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

IDEA中新建/切换Git分支的实现步骤

《IDEA中新建/切换Git分支的实现步骤》本文主要介绍了IDEA中新建/切换Git分支的实现步骤,通过菜单创建新分支并选择是否切换,创建后在Git详情或右键Checkout中切换分支,感兴趣的可以了... 前提:项目已被Git托管1、点击上方栏Git->NewBrancjsh...2、输入新的分支的

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os