Go语言开发基于SQLite数据库实现用户表修改接口(四)

背景

上一章
Go语言开发基于SQLite数据库实现用户表查询详情接口(三)
这一章我们实现用户表的修改接口

代码实现

mapper层

type UserMapper interface {UpdateById(user *model.User, id uint64) error}type userMapper struct {
}func (m *userMapper) UpdateById(user *model.User, id uint64) error {return model.UpdateById(user.TableName(), user, id)
}

ModelTable实现

// UpdateById 根据 ID 更新数据
func UpdateById(tableName string, dest interface{}, id uint64) error {// 获取结构体的值和类型val := reflect.ValueOf(dest)if val.Kind() == reflect.Ptr {val = val.Elem() // 获取指向结构体的指针值}if val.Kind() != reflect.Struct {return fmt.Errorf("model must be a pointer to a struct")}var values []interface{}var setClauses []string// 遍历结构体字段,构造 SQL 语句for i := 0; i < val.NumField(); i++ {field := val.Type().Field(i)fieldValue := val.Field(i)// 获取结构体字段的数据库标签dbField := field.Tag.Get("db")if dbField == "" {// 如果没有数据库标签,就跳过该字段continue}// 仅更新非零值的字段if !isZeroValue(fieldValue) {// 构建 SET 子句setClauses = append(setClauses, fmt.Sprintf("%s = ?", dbField))values = append(values, fieldValue.Interface())}}// 如果没有可更新的字段,直接返回if len(setClauses) == 0 {return fmt.Errorf("no fields to update")}// 构建完整的 SQL 语句setClause := strings.Join(setClauses, ", ")updateSQL := fmt.Sprintf("UPDATE %s SET %s WHERE id = ?", tableName, setClause)// 将 ID 添加到参数列表的最后values = append(values, id)// 执行更新操作_, err := config.Db.Exec(updateSQL, values...)if err != nil {return err}return nil
}// isZeroValue 判断一个反射值是否为零值
func isZeroValue(v reflect.Value) bool {// 如果是指针类型,判断指针是否为 nilif v.Kind() == reflect.Ptr {return v.IsNil()}// 对于结构体,数组等类型,判断是否是其零值return v.IsZero()
}

这里我们映射的结构体中的对应db字段 , 这样的好处是我们这个方法是基础方法,其他结构体中只要有ModelTable结构体,我们就可以直接继续使用了。
在这里插入图片描述

service层

type UserService interface {UpdateById(user *model.User, id uint64) error}

service实现层

type UserServiceImpl struct {m mapper.UserMapper
}func (u UserServiceImpl) UpdateById(user *model.User, id uint64) error {return u.m.UpdateById(user, id)
}

controller层

type UserController struct {UserService service.UserService
}func (u *UserController) UpdateById(rc *req.Ctx) {id := uint64(req.PathParamInt(rc.GinCtx, "id"))user := new(model.User)req.BindJsonAndValid(rc.GinCtx, user)assert.IsTrue(user.Username != "" || user.PassWord != "", "账号密码需传其中一个")//user.PassWord = utils.PwdHash(user.PassWord)err := u.UserService.UpdateById(user, id)assert.IsNil(err)
}

这里也有个PathParamInt方法 路径传参,传主键ID

func PathParamInt(g *gin.Context, pm string) int {value, _ := strconv.Atoi(g.Param(pm))return value
}

接口

在这里插入图片描述

测试

在这里插入图片描述

源码地址

使用Go语言开发基于SQLite数据库实现用户表相关接口项目示例,可进行扩展,拿来即用

参考

代码风格参考的mayfly-go ,SQLite这块是自己实现的

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

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

相关文章

【C++学习(35)】在Linux中基于ucontext实现C++实现协程(Coroutine),基于C++20的co_await 协程的关键字实现协程

文章目录 为什么使用协程协程的理解协程优势协程的原语操作yield 与 resume 是一个switch操作&#xff08;三种实现方式&#xff09;&#xff1a; 基于 ucontext 的协程基于 XFiber 库的操作1 包装上下文2 XFiber 上下文调度器2.1 CreateFiber2.2 Dispatch 基于C20的co_return …

844.比较含退格的字符串

java用 O&#xff08;1&#xff09;空间这个方法&#xff0c;容易挺多bug的… O&#xff08;1&#xff09;空间 #&#xff1a;删除前一个字符 》 从后面开始判断&#xff08;这样可以用跳过的思想&#xff09;不能使用两次 i- - 来处理 # 的操作&#xff0c;会造成误删了前面…

大数据实训室建设的必要性

一、大数据发展的背景 大数据作为当今信息技术领域的核心驱动力&#xff0c;正在深刻地改变着社会的各个方面。它不仅仅是指数据量庞大&#xff0c;更重要的是指数据的多样性、实时性和复杂性。随着云计算、物联网等技术的迅猛发展&#xff0c;大数据已成为推动经济社会发展的…

数据结构------队列(Java语言描述)

一、队列的概念 队列是一种数据结构&#xff0c;它遵循先进先出的原则。就像排队买东西一样&#xff0c;先到的人先得到服务&#xff0c;先进入队列的数据元素先被取出。例如&#xff0c;在一个银行排队系统中&#xff0c;顾客按照到达的先后顺序排队等待办理业务。第一个进入…

SD外向交货单

1、写在前面 1.1、文档说明 本文档将介绍外向交货单的创建、修改、删除、过账以及冲销&#xff0c;并且包含如何使用代码来实现上述过程。另外&#xff0c;还将介绍衍生出的交货单屏幕增强和BAPI维护扩展字段等内容。 1.2、关于外向交货单 在 SAP系统中&#xff0c;外向交货…

请解释Python中的装饰器是什么?如何使用它们?

1、请解释Python中的装饰器是什么&#xff1f;如何使用它们&#xff1f; 在Python中&#xff0c;装饰器是一个接受一个函数作为参数的可调用对象&#xff08;通常是一个函数&#xff09;。装饰器本质上是一个高阶函数&#xff0c;因为它接受一个函数作为参数并返回一个新的函数…

MyBatis——增删查改(XML 方式)

1. 查询 1.1. 简单查询 使用注解的方式主要是完成一些简单的增删查改功能&#xff0c;如果要实现复杂的 SQL 功能&#xff0c;还是建议使用 XML 来配置映射语句&#xff0c;将 SQL 语句写在 XML 配置文件中 如果要操作数据库&#xff0c;需要做以下的配置&#xff0c;与注解…

K8S如何基于Istio实现全链路HTTPS

K8S如何基于Istio实现全链路HTTPS Istio 简介Istio 是什么?为什么选择 Istio?Istio 的核心概念Service Mesh(服务网格)Data Plane(数据平面)Sidecar Mode(边车模式)Ambient Mode(环境模式)Control Plane(控制平面)Istio 的架构与组件Envoy ProxyIstiod其他组件Istio 的流量管…

vue3 中那些常用 靠copy 的内置函数

文章目录 vue3 常用函数罗列总结vue3 中批量注册组件vue3 自定义指令应用define 应用补充defineComponent 不同场景应用实例 vue3 常用函数罗列总结 toRefs 用途&#xff1a; 用于将一个响应式对象&#xff08;例如reactive创建的对象&#xff09;转换为普通对象&#xff0c;其…

docker镜像源,亲测可用,时间2024-11-14

最近由于特殊原因,docker拉取镜像总是失败 如果遇到docker拉取镜像失败 可以通过添加镜像源的方式解决 vim /etc/docker/daemob.json 添加如下内容 {"registry-mirrors": ["https://docker.rainbond.cc"] } 重新加载配置 sudo systemctl daemon-reload…

什么是AIGC?分清AI技术词

目录 1.AIGC 2.About Generative AI 详细对比表格 1.AIGC 自Open-AI发布Chat-GPT以来&#xff0c;国内外各大科技公司都展开了AI军备竞赛。从过去的某一天开始&#xff0c;我们突然发现AI可以帮助我们生成文字、图片、音频、视频等内容了&#xff0c;而且开始让人难以分清背…

鸿蒙学习生态应用开发能力全景图-开发者支持平台(5)

鸿蒙相关平台作用&#xff1a;  开发者社区&#xff1a;开发者技术交流平台&#xff0c;帮助开发者探索开发实践、交流心得经验、获悉业界动态、答疑解惑。  开发者学堂&#xff1a;聚合官方鸿蒙生态课程&#xff0c;课程有慕课、微课、直播课、训练营等多种形式&#xff…

51c大模型~合集44

我自己的原文哦~ https://blog.51cto.com/whaosoft/11884382 #DR4SR 最佳学生论文解读&#xff0c;中科大、华为诺亚&#xff1a;序列推荐新范式DR4SR 本工作由认知智能全国重点实验室 IEEE Fellow 陈恩红团队与华为诺亚方舟实验室完成。陈恩红教授团队深耕数据挖掘、机器学…

uniapp中webview全屏不显示导航栏解决方案

uniapp官网文档地址&#xff1a;https://uniapp.dcloud.net.cn/api/window/window.html#getappwebview <template><view class"index"><u-navbar :is-back"true" title"标题"" :title-width"650"></u-navb…

Go语言中的`io.Pipe`:实现进程间通信的利器

在Go语言中&#xff0c;io.Pipe提供了一种在同一个进程中模拟管道&#xff08;pipe&#xff09;的方式&#xff0c;使得我们可以像操作操作系统的管道一样&#xff0c;在不同的goroutine之间进行数据传递。本文将深入探讨io.Pipe的工作原理、使用方法及其在实际开发中的应用场景…

openwebui二改界面环境搭建

1、下载源码 https://github.com/open-webui/open-webui 2、编译前端 npm i npm run dev 注意版本要求&#xff1a; Python Version: Python 3.11Node.js Version: 20.10 浏览器访问&#xff1a;http://localhost:5173/ 3、编译后端 cd backend conda create --name op…

HCIP-快速生成树RSTP

一、RSTP是什么 STP&#xff08;Spanning Tree Protocol &#xff09;是生成树协议的英文缩写。该协议可应用于环路网络&#xff0c;通过一定的算法实现路径冗余&#xff0c;同时将环路网络修剪成无环路的树型网络&#xff0c;从而避免报文在环路网络中的增生和无限循环。 RS…

多进程/线程并发服务器

多进程&#xff1a; #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <netinet/in.h> #include <string.h> #include <unistd.h> #include <stdlib.h>#define SER_PORT…

在Element Ui中支持从系统粘贴版中获取图片和PDF,Docx,Doc,PPT等文档

在上一篇中&#xff0c;我们单纯的实现了Ctrl V实现从粘贴版中获取图片信息&#xff0c;但是点击上传的时候会有个bug&#xff0c;就是点击文件上传的时候&#xff0c;会出现一个bug&#xff0c;这篇&#xff0c;我们将在上一篇的基础上进行完善&#xff0c;并支持从粘贴版中获…

《数据可视化技术》上机报告

一、实验目的及要求 掌握pyecharts数据可视化环境搭建以及pyecharts交互式基础图形的绘制。 &#xff08;1&#xff09;掌握pyecharts中初始配置项&#xff0c;系列配置项&#xff0c;全局配置项的配置方法。 &#xff08;2&#xff09;掌握pyecharts中条形图的绘制方法。 …