用Nest实现对数据库的增删改查~

news2025/1/13 13:09:39

概述

为了与 SQL和 NoSQL 数据库集成,Nest 提供了 @nestjs/typeorm 包。Nest 使用TypeORM是因为它是 TypeScript 中最成熟的对象关系映射器( ORM )。因为它是用 TypeScript 编写的,所以可以很好地与 Nest 框架集成。
TypeORM 提供了对许多关系数据库的支持,比如 PostgreSQL 、Oracle、Microsoft SQL Server、SQLite,甚至像 MongoDB 这样的 NoSQL 数据库。

安装插件

npm安装

npm install --save @nestjs/typeorm typeorm mysql2

或者yarn安装

yarn add @nestjs/typeorm typeorm mysql

连接数据库

forRoot() 方法支持所有TypeORM包中createConnection()函数暴露出的配置属性

配置字段描述
type: ‘mysql’数据库类型
host: ‘localhost’连接ip
port: 3306端口
username: ‘root’数据库连接账号
password: ‘123456’数据库连接密码
database: ‘testbase’要连接的数据库名(需要手动创建名为testbase数据库)
如果找不到对应的数据库,报如下错误在这里插入图片描述
entities: []要加载的实体
synchronize: true警告:设置 synchronize: true 不能被用于生产环境,否则您可能会丢失生产环境数据

app.module.ts中配置

import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',//数据库类型
      host: 'localhost',//连接ip
      port: 3306,//端口
      username: 'root',//数据库连接账号
      password: '123456',//数据库连接密码
      database: 'testbase',//要连接的数据库名(需要手动创建名为testbase数据库)
      entities: [],
      synchronize: true,//警告:设置 synchronize: true 不能被用于生产环境,否则您可能会丢失生产环境数据
    }),
  ],
  controllers: [],
  providers: [],
})
export class AppModule { }

完整代码

以下示例为简单的用户列表增删改查接口

  1. 创建实体
    user.entity.ts
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm';

@Entity()
export class User {
  @PrimaryGeneratedColumn()//int类型 + 主键 + 自增长
  id: number;

  @Column()
  name: string;

  @Column({ default: '1' })//默认值为1 
  status: string;
}
  1. 创建服务
    users.service.ts
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { User } from './user.entity';

@Injectable()
export class UsersService {
  constructor(
    @InjectRepository(User)
    private usersRepository: Repository<User>,
  ) {}
  
  // 定义方法供路由调用
  findAll() {
    return this.usersRepository.find();
  }

  // 定义方法供路由调用
  add(user: User) {
    return this.usersRepository.insert(user)
  }

  // 定义方法供路由调用
  update(user: User) {
    return this.usersRepository.update(user.id, user)
  }

  // 定义方法供路由调用
  remove(id: any) {
    return this.usersRepository.remove(id)
  }
  
}
  1. 创建控制器
    users.controller.ts
import { Controller, Get, Post, Body, Delete, Put } from '@nestjs/common';
import { UsersService } from './users.service';
import { User } from './user.entity';

@Controller('user')
export class UsersController {
    // 将UsersService服务注入到userService属性中
    constructor(private userService: UsersService) {}
    
    // 获取列表
    @Get('list')// [Get请求] 路由:/user/list
    findAll() {

        // 使用userService的findAll方法
        return this.userService.findAll()
    }
    
    // 插入数据
    @Post('add')// [Post请求] 路由:/user/add
    async findOne(@Body() param: User) {

        // 使用userService的add方法
        return this.userService.add(param)
    }
    
    // 修改数据
    @Put('update')// [Put请求] 路由:/user/update
    async updateOne(@Body() param: User){

        // 使用userService的update方法
        return this.userService.update(param)
    }
    
    // 删除数据
    @Delete('remove')// [Delete请求] 路由:/user/remove
    async remove(@Body() id:any) {

        // 使用userService的remove方法
        return this.userService.remove(id)
    }

}
  1. 创建user模块(引入实体entity、服务service、控制器controller
    user.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UsersService } from './users.service';
import { UsersController } from './users.controller';
import { User } from './user.entity';

@Module({
  imports: [TypeOrmModule.forFeature([User])],//引入实体
  providers: [UsersService],//引入服务
  controllers: [UsersController],//引入控制器
})
export class UsersModule {}

  1. 主模块中引入user模块
    app.module.ts
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UsersModule } from './user/user.module';
import { User } from './user/user.entity';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',//数据库类型
      host: 'localhost',//连接ip
      port: 3306,//端口
      username: 'root',//数据库连接账号
      password: '123456',//数据库连接密码
      database: 'testbase',//要连接的数据库名(需要手动创建名为testbase数据库)
      entities: [User],//加载的实体(User对应表名是user,表不存在时会自动创建表)
      synchronize: true,//警告:设置 synchronize: true 不能被用于生产环境,否则您可能会丢失生产环境数据
    }),
    UsersModule//引入user模块
  ],
  controllers: [],
  providers: [],
})
export class AppModule { }

接口测试

1. 新增测试

图中可以看到响应结果中看到新增的数据,和该数据的id
在这里插入图片描述
查询可以看到数据新增成功了
在这里插入图片描述
多插入几条数据
在这里插入图片描述
再次查询,数据也变多了
在这里插入图片描述

2. 编辑测试

在原有的4条数据的基础上,编辑一条id为1的数据
响应结果中affected表示受影响的条数为1
在这里插入图片描述
再次查询可以看到id为1的数据被成功修改了
在这里插入图片描述

3. 删除测试

删除一个id为1的数据(重复删除id为1的数据不会报错,只是没有任何作用)
在这里插入图片描述
再次查询后,id为1的数据消失了
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1618271.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WEB攻防-ASP中间件IIS 短文件名探针安全漏洞

IIS短文件名探针安全漏洞是一个与IIS&#xff08;Internet Information Services&#xff09;服务相关的安全问题。该漏洞主要是由于HTTP请求中使用了旧DOS 8.3名称约定&#xff08;SFN&#xff09;的代字符&#xff08;〜&#xff09;波浪号&#xff0c;这使得远程攻击者有可能…

使用 Meta Llama 3 构建人工智能的未来

使用 Meta Llama 3 构建人工智能的未来 现在提供 8B 和 70B 预训练和指令调整版本,以支持广泛的应用 使用 Meta AI 体验 Llama 3 我们已将 Llama 3 集成到我们的智能助手 Meta AI 中,它扩展了人们完成工作、创造和与 Meta AI 联系的方式。通过使用 Meta AI 进行编码任务和解…

ROS学习笔记(13)坐标变换(TF和TF2)

0.前提 我翻了一下我以前的教程发现我居然没有讲过TF坐标转换&#xff0c;那现在补上。在机器人学中坐标转换是一个极为重要的概念、内容&#xff0c;在大量的科技公司招聘机器人岗位的人才时掌握机器人运动学正解和逆解等都是加分项。机器人在实际应用当中会涉及到大量的位置…

椋鸟数据结构笔记#11:排序·下

文章目录 外排序&#xff08;外部排序&#xff09;文件拆分并排序归并文件两个文件归并多文件归并优化 萌新的学习笔记&#xff0c;写错了恳请斧正。 外排序&#xff08;外部排序&#xff09; 当数据量非常庞大以至于无法全部写入内存时&#xff0c;我们应该怎么排序这些数据呢…

冈萨雷斯数字图像处理资源(课后习题答案+代码+图片)

冈萨雷斯数字图像处理相关资源整理&#xff0c;资源全部来源互联网&#xff0c;方便大家下载 冈萨雷斯数字图像处理相关资源整理 课后习题 冈萨雷斯数字图像处理源代码

16.Nacos环境隔离

环境隔离namespace Namespace->Group->Service/Data->集群->实例 Namespace: Group&#xff1a; nacos控制台新增一个开发环境的命名空间&#xff1a;dev, 会产生命名空间的id。 将命名空间的id配置到微服务的配置文件中&#xff1a; spring:cloud:nacos:server…

MATLAB将多张小图整合到一张大图形成模板图

MATLAB将多张小图整合到一张大图形成模板图 代码如下: clc;close all;clear all;warning off;%清除变量 rand(seed, 100); randn(seed, 100); format long g;foldername字符模板; [datacell,filenamecell,filenameAllcell]readfun_1n(foldername); K2length(filenamecell);% …

25计算机考研院校数据分析 | 上海交通大学

上海交通大学电子信息与电气工程学院成立于2001年12月&#xff0c;其前身可湖源至百年前的电机专科&#xff0c;具有中国电气工程师“摇篮”之美称。50年代根据学科发展需要分为电工与计算机科学系(三系)和电子工程系(四系)。1985年&#xff0c;三系和四系合并&#xff0c;成立…

电子签名在人力资源中的应用:让HR工作更高效

人力资源&#xff08;HR&#xff09;行业是电子签领域的重要应用之一&#xff0c;它可以在以下场景中使用电子签&#xff1a; 1. 在招聘流程中&#xff0c;HR部门可以利用电子签名工具来完成与招聘候选人之间的任何文件签署操作。例如&#xff0c;维护人才库数据库、简历、面试…

RAG:智能图书馆员引领AI的知识之旅

想象一下&#xff0c;你是一个法官&#xff0c;面对一个复杂的案件&#xff0c;你需要查阅大量的法律文献来找到相关的案例和法律条文。在AI的世界里&#xff0c;也有一个类似的“法官”——大型语言模型&#xff08;LLMs&#xff09;。它们能够回答各种问题&#xff0c;但有时…

RISC-V CVA6 在 Linux 下相关环境下载与安装

RISC-V CVA6 在 Linux 下相关环境下载与安装 所需环境与源码下载 CVA6 源码下载 首先&#xff0c;我们可以直接从 GitHub 一次性拉取所有源码&#xff1a; git clone --recursive https://github.com/openhwgroup/cva6.git如果这里遇到网络问题&#xff0c;拉取失败&#x…

vulfocus靶场struts2 命令执行 CVE-2016-3081

远程攻击者利用漏洞可在开启动态方法调用功能的Apache Struts 2服务器上执行任意代码&#xff0c;取得网站服务器控制权。 影响版本: Struts 2.3.20 - Struts Struts 2.3.28 (except 2.3.20.3 and 2.3.24.3) 工具利用&#xff1a; struts2 综合利用工具&#xff1a; http://i…

4月23号总结

java实现发送邮件 在做聊天室项目的时候&#xff0c;由于需要发送邮箱验证码&#xff0c;所以自己查找了这方面的内容。 首先需要在Maven里面依赖 <dependency><groupId>com.sun.mail</groupId><artifactId>javax.mail</artifactId><versio…

牛客社区所有的表和SQL语句

文章目录 1 帖子表 discuss_post1.1 字段描述1.2 相关功能描述1.2.1 分页查询帖子1.2.2 查询帖子总数量1.2.3 插入一条帖子记录1.2.4 根据帖子ID查询某条帖子1.2.5 更新帖子评论数量1.2.6 更新帖子类型1.2.6 更新帖子状态1.2.7 更新帖子分数 2 用户表 user2.1 字段描述2.2 相关…

spring一二三级缓存和@Lazy解决循环依赖流程

简单对象指的是 实例化后还没有属性注入的时候的早期bean lambda表达式用于判断a是否存在aop代理 假如a和b循环依赖&#xff0c;a实例化时&#xff0c; bean创建流程如下&#xff1a; 0&#xff0c;创建一个set记录当前正在实例化的bean&#xff0c; 1.实例化a的简单对象时…

陆金所控股一季报到底是利好还是利空?

3月底&#xff0c;陆金所控股&#xff08;LU.N;06623.HK&#xff09;因其特别分红方案受到市场高度关注。但在4月23日发布的2024年一季度财报中&#xff0c;陆金所控股营收同比下降30.9%&#xff0c;净亏损8.3亿元。 两者对比&#xff0c;外界不由得对公司的经营状况产生疑惑。…

docker内实现多机多卡分布式训练

docker内实现多机多卡分布式训练 1. 多台docker宿主机网络配置2. 创建overlay 网络3. 注意 1. 多台docker宿主机网络配置 https://docs.docker.com/network/overlay/ 这里需要创建overlay网络使得多台宿主机的容器可以通过网络连接 初始化swarm集群&#xff0c;并设置主节点&a…

条件编译 #和##运算符

目录 1. #运算符2. ##运算符3. 条件编译4. 题目分享总结 正文开始 前言: 本章为C语言语法完结撒花, 下文将进行C语言中#和##操作符以及条件编译的讲解, 来进一步让我们了解C语言. 作者主页: 酷酷学!!! 1. #运算符 #运算符将宏的⼀个参数转换为字符串字⾯量。它仅允许出现在带…

【刷题】前缀和入门

送给大家一句话&#xff1a; 既然已经做出了选择&#xff0c;最好还是先假定自己是对的。焦虑未来和后悔过去&#xff0c;只经历一个就够了。 – 张寒寺 《不正常人类症候群》 ☆ミヾ(∇≦((ヾ(≧∇≦)〃))≧∇)ノ彡☆ ☆ミヾ(∇≦((ヾ(≧∇≦)〃))≧∇)ノ彡☆ ☆ミヾ(∇≦((ヾ…

比特币中的符文是什么?

比特币中的符文是什么&#xff1f; 比特币符文是存在于比特币区块链上的独特的、可替代的代币。它们旨在代表具有独特特征和元数据的可替代资产。 Ordinals 协议的创建者 Casey Rodamor 最近放弃了一项替代 BRC-20 可替代代币协议的提案&#xff0c;该替代方案被称为 Runes。 破…