当前位置: 首页 > news >正文

Go语言开发基于SQLite数据库实现用户表查询详情接口(三)

背景

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

代码实现

mapper层

type UserMapper interface {GetById(id uint64) (*model.User, error)}type userMapper struct {
}func (m *userMapper) GetById(id uint64) (*model.User, error) {// 创建 model.User 的指针实例user := &model.User{}result, err := model.GetById(user.TableName(), id, user)if err != nil {return nil, err}// 确保返回的结果是 *model.User 类型user, ok := result.(*model.User)if !ok {return nil, fmt.Errorf("expected *model.User, but got %T", result)}return user, nil
}

ModelTable实现

func GetById(tableName string, id uint64, dest interface{}) (interface{}, error) {// 确保 dest 是指针类型val := reflect.ValueOf(dest)if val.Kind() != reflect.Ptr || val.IsNil() {return nil, fmt.Errorf("dest must be a non-nil pointer")}// 构造 SQL 查询query := fmt.Sprintf("SELECT * FROM %s WHERE id = ? LIMIT 1", tableName)// 执行查询row := config.Db.QueryRow(query, id)// 获取结构体的字段fieldPointers, err := getFieldPointers(reflect.TypeOf(dest).Elem(), reflect.ValueOf(dest).Elem())if err != nil {return nil, err}// 使用 Scan 将查询结果映射到结构体err = row.Scan(fieldPointers...)if err != nil {if err == sql.ErrNoRows {return nil, fmt.Errorf("No rows found with id %d", id)}return nil, err}return dest, nil
}// 递归地获取结构体字段的指针(支持嵌套结构体)
func getFieldPointers(t reflect.Type, v reflect.Value) ([]interface{}, error) {var fieldPointers []interface{}for i := 0; i < t.NumField(); i++ {field := t.Field(i)fieldValue := v.Field(i)// 如果字段是结构体类型,递归进入if fieldValue.Kind() == reflect.Struct {// 递归处理嵌套的结构体字段nestedPointers, err := getFieldPointers(field.Type, fieldValue)if err != nil {return nil, err}fieldPointers = append(fieldPointers, nestedPointers...)} else {// 否则将字段的指针添加到字段指针数组fieldPointers = append(fieldPointers, fieldValue.Addr().Interface())}}return fieldPointers, nil
}

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

service层

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

service实现层

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

controller层

type UserController struct {UserService service.UserService
}func (u *UserController) GetById(rc *req.Ctx) {id := uint64(req.PathParamInt(rc.GinCtx, "id"))user, err := u.UserService.GetById(id)assert.IsNil(err)rc.ResData = user
}

这里有个PathParamInt方法 获取路径上面的参数

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

接口

在这里插入图片描述

测试

在这里插入图片描述

源码地址

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

参考

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

http://www.lryc.cn/news/483683.html

相关文章:

  • (11)(2.1.7) FETtec OneWire ESCs(二)
  • Springboot maven常见依赖、配置文件笔记
  • Ceph后端两种存储引擎介绍
  • C++入门基础知识140—【关于C++ 类构造函数 析构函数】
  • 基于标签相关性的多标签学习
  • macOS系统下使用SQLark连接达梦数据库
  • 爬虫如何解决短效代理被封的问题?
  • Jmeter基础篇(22)服务器性能监测工具Nmon的使用
  • Spring Boot 集成 RabbitMQ:消息生产与消费详解
  • JSON-RPC-CXX深度解析:C++中的远程调用利器
  • 【后端速成Vue】模拟实现翻译功能
  • 人脸识别技术:从算法到深度学习的全面解析
  • WPF学习之路,控件的只读、是否可以、是否可见属性控制
  • 植物神经紊乱不用怕,科学锻炼助你找回平衡✨
  • shell 100例
  • CSS教程(二)- CSS选择器
  • Ubuntu20.04 解决一段时间后键盘卡死 输入延迟很大的问题 ubuntu
  • http(s)接口设计注意事项
  • Font Awesome Web 应用图标
  • bridge-vlan
  • 【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
  • 华为云前台展示公网访问需要购买EIP,EIP流量走向
  • 排序算法 -插入排序
  • 如何使用.bat实现电脑自动重启?
  • 使用VSCode远程连接服务器并解决Neo4j无法登陆问题
  • 使用React和Vite构建一个AirBnb Experiences克隆网站
  • HBase压测 ycsb
  • 基于Python+Django+Vue3+MySQL实现的前后端分类的商场车辆管理系统
  • 网络安全web基础_HTML基础(扫盲篇)
  • (附项目源码)Java开发语言,监督管家APP的设计与实现 58,计算机毕设程序开发+文案(LW+PPT)