在 Nest.js 中执行 SQL 查询通常涉及使用 TypeORM 或 Sequelize 这样的 ORM(对象-关系映射) 数据库操作新选择:Drizzle ORM 的安装与基础用法-CSDN博客库。这些库使得在 Nest.js 应用程序中连接和操作 SQL 数据库变得更加简单和直观。
以下是一个使用 TypeORM 在 Nest.js 中执行 SQL 查询的示例代码:
首先,确保你已经在项目中安装了 TypeORM:
在user模块中的entites中;user.entity.ts中有如下代码:
import { Column, Entity, PrimaryGeneratedColumn } from "typeorm";
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number
@Column()
username: string
@Column()
password: string
}
在user模块中的service中;user.service.ts中有如下代码:
import { Injectable } from '@nestjs/common';
import { UserDto } from './dto/create-user.dto';
import { InjectRepository } from '@nestjs/typeorm';
import { User } from './entities/user.entity';
import { Repository } from 'typeorm';
@Injectable()
export class UserService {
constructor(
@InjectRepository(User) private readonly user: Repository<User>) { }
async login(userDto: UserDto) {
const userInfo = await this.user.findOne({
where: {
username: userDto.username,
password: userDto.password,
},
})
return userInfo;
}
async register(userDto: UserDto) {
const existingUser = await this.user.findOne({
where: {
username: userDto.username,
},
});
if (existingUser) {
return '用户名已存在';
}
const data = new User();
data.username = userDto.username;
data.password = userDto.password;
return this.user.save(data);
}
}
很明显没有使用sql语句,但是也完成了sql操作;
在另一个项目中使用的是
user模块中的user.model.ts中代码如下:
import { Column, Model, Table } from 'sequelize-typescript';
@Table
export class User extends Model<User> {
@Column
username: string;
@Column
password: string;
@Column
avatar: string;
}
在user.service.ts中代码如下:
import { Injectable } from '@nestjs/common';
import { CreateUserDto } from './dto/create-user.dto';
import { InjectModel } from '@nestjs/sequelize';
import { User } from './model/user.model';
@Injectable()
export class UserService {
constructor(@InjectModel(User) private userModel: typeof User,) {
}
async create(createUserDto: CreateUserDto) {
let res = await this.userModel.build({
...createUserDto
})
await res.save()
return res
}
async findAll() {
let res = await this.userModel.findAll()
return res
}
async find(createUserDto: CreateUserDto) {
let res = await this.userModel.findOne({
where: {
...createUserDto
}
})
return res
}
async findOne(username: string) {
let res = await this.userModel.findOne({
where: {
username
}
})
return res !== null ? res : null
}
async uploadAvatar(username: string, avatar: string) {
let res = await this.userModel.update({
avatar
}, {
where: {
username: username
}
})
return {
code: '200',
msg: "上传成功",
data: res
}
}
async hasAvatar(username: string) {
let res = await this.userModel.findOne({
where: {
username: username
}
})
return res.avatar !== null
}
}
在Node.js开发中,TypeORM 是一个非常受欢迎的ORM(Object-Relational Mapping,对象关系映射)库,它允许你用JavaScript/TypeScript对象的形式操作数据库,支持多种数据库系统,包括MySQL。使用TypeORM可以让你以更加面向对象的方式编写数据库交互代码,而不需要直接编写SQL语句(尽管它也支持原生SQL)。TypeORM简化了数据库操作,提供了实体定义、关系映射、迁移等高级功能。
不过,TypeORM并不是连接Node.js和MySQL的唯一选择。Node.js生态中还有其他流行的库可以用来连接MySQL,比如:
-
MySQL: 这是MySQL官方提供的Node.js驱动程序,允许你直接使用MySQL协议与MySQL服务器通信。它比较底层,适合需要精细控制SQL查询或者性能至上的场景。
-
Sequelize: 是一个功能丰富的ORM库,支持多种数据库,包括MySQL。Sequelize提供了强大的事务处理、关联关系定义、迁移等功能,以及一套基于Promise的API。
-
mysql2: 是一个Node.js的MySQL客户端,它是
mysql
模块的升级版,提供了更好的性能和额外的功能,同时保持了与mysql
模块的API兼容性。
选择使用哪个库取决于你的具体需求,如项目规模、是否需要ORM特性、团队熟悉度等因素。TypeORM因其强大的ORM功能和对TypeScript的良好支持,成为很多项目特别是中大型项目或强类型偏好项目的首选。