在NestJS中集成和使用数据库
- 832字
- 4分钟
- 2024-07-11
本文将详细介绍如何在 NestJS 项目中集成和使用关系数据库和非关系数据库,包括数据库配置、模型设计和复杂查询的实现。
集成关系数据库
配置 TypeORM
TypeORM 是一个功能强大的 ORM 工具,支持多种关系数据库。我们将以 MySQL 为例,介绍如何配置 TypeORM。
- 安装必要的包:
1npm install --save @nestjs/typeorm typeorm mysql2
- 在
app.module.ts
中配置 TypeORM:
1import { Module } from "@nestjs/common";2import { TypeOrmModule } from "@nestjs/typeorm";3import { UsersModule } from "./users/users.module";4
5@Module({6 imports: [7 TypeOrmModule.forRoot({8 type: "mysql",9 host: "localhost",10 port: 3306,11 username: "root",12 password: "password",13 database: "test",14 entities: [__dirname + "/**/*.entity{.ts,.js}"],15 synchronize: true,16 }),17 UsersModule,18 ],19})20export class AppModule {}
设计数据库模型
创建一个 User
实体,定义用户的数据库模型:
1import { Entity, Column, PrimaryGeneratedColumn } from "typeorm";2
3@Entity()4export class User {5 @PrimaryGeneratedColumn()6 id: number;7
8 @Column()9 name: string;10
11 @Column()12 email: string;13
14 @Column()15 password: string;16}
进行数据库操作
在 users.service.ts
中实现 CRUD 操作:
1import { Injectable } from "@nestjs/common";2import { InjectRepository } from "@nestjs/typeorm";3import { Repository } from "typeorm";4import { User } from "./user.entity";5
6@Injectable()7export class UsersService {8 constructor(9 @InjectRepository(User)10 private usersRepository: Repository<User>,11 ) {}12
13 findAll(): Promise<User[]> {14 return this.usersRepository.find();15 }16
17 findOne(id: number): Promise<User> {18 return this.usersRepository.findOne(id);19 }20
21 create(user: User): Promise<User> {22 return this.usersRepository.save(user);23 }24
25 async update(id: number, user: Partial<User>): Promise<void> {26 await this.usersRepository.update(id, user);27 }28
29 async remove(id: number): Promise<void> {30 await this.usersRepository.delete(id);31 }32}
实现复杂查询
在 users.service.ts
中实现复杂查询:
1import { Injectable } from "@nestjs/common";2import { InjectRepository } from "@nestjs/typeorm";3import { Repository } from "typeorm";4import { User } from "./user.entity";5
6@Injectable()7export class UsersService {8 constructor(9 @InjectRepository(User)10 private usersRepository: Repository<User>,11 ) {}12
13 // 复杂查询示例:查找包含特定关键词的用户14 async findUsersByKeyword(keyword: string): Promise<User[]> {15 return this.usersRepository16 .createQueryBuilder("user")17 .where("user.name LIKE :keyword OR user.email LIKE :keyword", {18 keyword: `%${keyword}%`,19 })20 .getMany();21 }22}
集成非关系数据库
配置 Mongoose
Mongoose 是一个流行的 ODM 工具,适用于 MongoDB。我们将介绍如何配置 Mongoose。
- 安装必要的包:
1npm install --save @nestjs/mongoose mongoose
- 在
app.module.ts
中配置 Mongoose:
1import { Module } from "@nestjs/common";2import { MongooseModule } from "@nestjs/mongoose";3import { UsersModule } from "./users/users.module";4
5@Module({6 imports: [MongooseModule.forRoot("mongodb://localhost/nest"), UsersModule],7})8export class AppModule {}
设计数据库模型
创建一个 User
模型,定义用户的数据库模型:
1import { Schema } from "mongoose";2
3export const UserSchema = new Schema({4 name: String,5 email: String,6 password: String,7});
进行数据库操作
在 users.service.ts
中实现 CRUD 操作:
1import { Injectable } from "@nestjs/common";2import { InjectModel } from "@nestjs/mongoose";3import { Model } from "mongoose";4import { User } from "./user.interface";5import { CreateUserDto } from "./create-user.dto";6
7@Injectable()8export class UsersService {9 constructor(@InjectModel("User") private readonly userModel: Model<User>) {}10
11 async findAll(): Promise<User[]> {12 return this.userModel.find().exec();13 }14
15 async findOne(id: string): Promise<User> {16 return this.userModel.findById(id).exec();17 }18
19 async create(createUserDto: CreateUserDto): Promise<User> {20 const createdUser = new this.userModel(createUserDto);21 return createdUser.save();22 }23
24 async update(id: string, user: Partial<User>): Promise<User> {25 return this.userModel.findByIdAndUpdate(id, user, { new: true }).exec();26 }27
28 async remove(id: string): Promise<User> {29 return this.userModel.findByIdAndRemove(id).exec();30 }31}
实现复杂查询
在 users.service.ts
中实现复杂查询:
1import { Injectable } from "@nestjs/common";2import { InjectModel } from "@nestjs/mongoose";3import { Model } from "mongoose";4import { User } from "./user.interface";5
6@Injectable()7export class UsersService {8 constructor(@InjectModel("User") private readonly userModel: Model<User>) {}9
10 // 复杂查询示例:查找包含特定关键词的用户11 async findUsersByKeyword(keyword: string): Promise<User[]> {12 return this.userModel13 .find({14 $or: [15 { name: new RegExp(keyword, "i") },16 { email: new RegExp(keyword, "i") },17 ],18 })19 .exec();20 }21}
总结
本文详细介绍了如何在 NestJS 中集成和使用关系数据库和非关系数据库。我们通过具体的配置和代码示例展示了如何使用 TypeORM 和 Mongoose 进行数据库操作、设计数据库模型以及实现复杂查询。在实际开发中,选择合适的数据库和 ORM/ODM 工具对于构建高效、可扩展的应用至关重要。


