菜单

数据库集成

相关源文件

目的与范围

本文档全面概述了 NestJS 中可用的数据库集成选项。它解释了如何使用官方支持的库和适配器将 NestJS 应用程序连接到各种数据库。NestJS 通过专门的包为多种数据库技术提供了头等支持,这些包与 NestJS 的依赖注入系统无缝集成。

NestJS 通过各种对象关系映射器 (ORM) 和对象文档映射器 (ODM) 支持 SQL 和 NoSQL 数据库。本文涵盖了主要的集成方法,即 TypeORM、Sequelize 和 Mongoose。有关数据库与 GraphQL 集成的更多信息,请参阅 GraphQL

来源:package.json

数据库集成架构

来源:sample/05-sql-typeorm/package.jsonsample/06-mongoose/package.jsonsample/07-sequelize/package.jsonsample/13-mongo-typeorm/package.json

TypeORM 集成

TypeORM 是一个高度灵活的 ORM,支持传统的 SQL 数据库和 MongoDB。NestJS 提供了专门的 @nestjs/typeorm 包,将 TypeORM 集成到 NestJS 的依赖注入系统中。

设置和配置

要在 NestJS 应用程序中使用 TypeORM,您需要安装所需的包

npm install @nestjs/typeorm typeorm

您还需要安装相应的数据库驱动程序包

npm install mysql2  # for MySQL/MariaDB
# or
npm install pg      # for PostgreSQL
# or
npm install sqlite3 # for SQLite
# or
npm install mongodb # for MongoDB

模块集成

TypeORM 通常在根应用程序模块级别使用 TypeOrmModule.forRoot() 方法进行集成

实体和存储库模式

TypeORM 集成支持存储库模式,其中每个实体都有一个相应的存储库来处理数据库操作。

来源:sample/05-sql-typeorm/package.jsonsample/13-mongo-typeorm/package.json

Sequelize 集成

Sequelize 是一个基于 Promise 的 Node.js ORM,用于 SQL 数据库。NestJS 提供了专门的 @nestjs/sequelize 包,用于将 Sequelize 集成到您的应用程序中。

设置和配置

要在 NestJS 应用程序中使用 Sequelize,您需要安装所需的包

npm install @nestjs/sequelize sequelize sequelize-typescript

您还需要安装数据库驱动程序

npm install mysql2  # for MySQL/MariaDB
# or
npm install pg      # for PostgreSQL
# or 
npm install sqlite3 # for SQLite

模块集成

Sequelize 使用 SequelizeModule.forRoot() 方法进行集成

模型和关联

Sequelize 使用模型来表示数据库表,并支持定义它们之间的关联。

来源:sample/07-sequelize/package.json

Mongoose 集成

Mongoose 是 MongoDB 的对象文档映射器 (ODM)。NestJS 提供了专门的 @nestjs/mongoose 包用于 Mongoose 集成。

设置和配置

要在 NestJS 应用程序中使用 Mongoose,您需要安装所需的包

npm install @nestjs/mongoose mongoose

模块集成

Mongoose 使用 MongooseModule.forRoot() 方法进行集成

模式和模型定义

Mongoose 使用模式来定义文档的结构,并使用模型与数据库集合进行交互。

来源:sample/06-mongoose/package.jsonsample/14-mongoose-base/package.json

数据库连接架构

来源:sample/05-sql-typeorm/package.jsonsample/06-mongoose/package.jsonsample/07-sequelize/package.json

数据库集成详细比较

功能TypeORMSequelizeMongoose
类型ORMORMODM
支持的数据库MySQL, PostgreSQL, MariaDB, SQLite, MS SQL, Oracle, MongoDBMySQL, PostgreSQL, MariaDB, SQLite, MS SQLMongoDB
NestJS 包@nestjs/typeorm@nestjs/sequelize@nestjs/mongoose
实体定义带装饰器的类带装饰器的类带装饰器的模式接口
查询语言QueryBuilder, Find OptionsSequelize 查询接口Mongoose 查询 API
关系支持一对一、一对多、多对多一对一、一对多、多对多References, Populate
事务支持是(有例外)
迁移支持
TypeScript 支持原生通过 sequelize-typescript通过 @types/mongoose

来源:package.jsonsample/05-sql-typeorm/package.jsonsample/06-mongoose/package.jsonsample/07-sequelize/package.json

TypeORM 集成详情

TypeORM 是功能最丰富的 ORM 集成,支持 SQL 数据库和 MongoDB。

建立连接

通过导入 TypeOrmModule 并使用配置对象调用其 forRoot() 方法来建立连接

存储库模式实现

TypeORM 利用存储库模式,该模式允许在数据访问逻辑和业务逻辑之间进行清晰的隔离。

来源:sample/05-sql-typeorm/package.jsonsample/13-mongo-typeorm/package.json

Sequelize 集成详情

Sequelize 为 SQL 数据库提供了强大的功能,支持事务和迁移。

建立连接

通过导入 SequelizeModule 并调用其 forRoot() 方法来建立连接

使用装饰器进行模型定义

NestJS 中的 Sequelize 大量使用装饰器来定义模型及其属性。

来源:sample/07-sequelize/package.json

Mongoose 集成详情

Mongoose 专门用于 MongoDB 集成,提供模式验证、中间件和填充功能。

建立连接

使用 MongooseModule.forRoot() 建立连接

模式定义

Mongoose 需要模式定义来定义集合中文档的结构。

来源:sample/06-mongoose/package.jsonsample/14-mongoose-base/package.json

高级数据库集成模式

存储库模式

存储库模式是一种常用的设计模式,用于将数据访问层与业务逻辑抽象化

工作单元模式

工作单元模式用于维护受业务事务影响的对象列表

数据库事务

所有支持的 ORM 都提供事务支持以确保数据的一致性

来源:package.jsonsample/05-sql-typeorm/package.jsonsample/06-mongoose/package.jsonsample/07-sequelize/package.json

数据库与 GraphQL 集成

NestJS 支持将数据库访问与 GraphQL 解析器结合使用,以创建高效的 API

有关 GraphQL 集成的更多详细信息,请参阅专门的 GraphQL 页面。

来源:sample/22-graphql-prisma/package.jsonsample/12-graphql-schema-first/package.jsonsample/23-graphql-code-first/package.json

数据库集成最佳实践

  1. 使用内置的 NestJS 集成模块 - 它们提供了与依赖注入系统的干净集成
  2. 将数据库逻辑封装在存储库或服务中 - 保持控制器不包含数据库访问代码
  3. 使用环境变量存储数据库凭据 - 切勿硬编码敏感信息
  4. 实现适当的错误处理 - 妥善捕获和处理数据库错误
  5. 对影响多个记录的操作使用数据库事务 - 确保数据一致性
  6. 应用适当的数据库索引 - 优化查询性能
  7. 考虑生产环境中的连接池 - 提高应用程序的效率和可伸缩性
  8. 使用迁移进行模式更改 - 使数据库模式与应用程序代码保持同步
  9. 实施适当的验证 - 在数据到达数据库之前对其进行验证
  10. 为数据库交互编写测试 - 确保数据访问逻辑按预期工作

来源:package.jsonsample/05-sql-typeorm/package.jsonsample/06-mongoose/package.jsonsample/07-sequelize/package.json

测试数据库集成

NestJS 提供了用于测试数据库交互的实用工具,包括模拟存储库和数据库连接的能力,或者使用内存数据库进行测试。

来源:package.json