当前位置:网站首页>Go语学习笔记 - gorm使用 - 表增删改查 | Web框架Gin(八)
Go语学习笔记 - gorm使用 - 表增删改查 | Web框架Gin(八)
2022-07-01 15:38:00 【剑客阿良_ALiang】
目录
学习笔记,写到哪是哪。
接着上一篇文章:Go语学习笔记 - gorm使用 - 数据库配置、表新增 | Web框架Gin(七)_剑客阿良_ALiang的博客-CSDN博客
数据库初始化配置已经弄好了,上一篇文章中简单的写了一个demo接口。
本篇文章接着上一篇,对表进行增删改查,同时对时间字段进行特殊处理。
项目地址:github地址
新增修改接口
一般我们在实际项目中,会把新增接口和更新修改接口合并,也就是传递参数中带ID的话则为修改,不带ID的话为新增。
按照项目结构的编写方式,在student_service下新增AddOrUpdateStudent方法。
方法代码如下:
//新增或者更新学生
func (t StudentImpl) AddOrUpdateStudent(student *db_entity.Student) rsp.ResponseMsg {
log.Logger.Info("新增或者更新学生参数:", log.Any("Student", student))
_db := mysql.GetDB()
if student.Id != 0 {
_db.Model(&student).Updates(student)
} else {
_db.Create(&student)
}
return *rsp.SuccessMsg("操作成功")
}注意:在接口测试中你会发现传递update_time时间字段解析错误,在下面的小结里面会讲到自定义事件结构体来解决json时间字段序列化问题。
查询所有未逻辑删除接口
在student_service下新增SelectAll方法,对del_flag为0的用户进行查询。
方法代码如下:
//查询所有学生
func (t StudentImpl) SelectAll() rsp.ResponseMsg {
log.Logger.Info("查询所有学生")
_db := mysql.GetDB()
var _result []db_entity.Student
_db.Where("del_flag = ?", 0).Find(&_result)
return *rsp.SuccessMsg(_result)
}根据ID删除接口
在student_service下新增根据ID删除数据接口。
方法代码如下:
//根据id删除学生
func (t StudentImpl) DeleteById(id int32) rsp.ResponseMsg {
log.Logger.Info("根据id删除学生")
_db := mysql.GetDB()
_db.Delete(&db_entity.Student{}, id)
return *rsp.SuccessMsg("删除成功")
}时间字段序列化问题处理
由于json不能直接序列化time.Time类型,网上有多种解决方法,我这边主要采用自定义时间类型重写序列化方法的方法来解决。
在constants目录下,创建common.go文件。
common.go代码如下:
package constants
import (
"database/sql/driver"
"fmt"
"time"
)
type HTime struct {
time.Time
}
var (
formatTime = "2006-01-02 15:04:05"
)
func (t HTime) MarshalJSON() ([]byte, error) {
formatted := fmt.Sprintf("\"%s\"", t.Format(formatTime))
return []byte(formatted), nil
}
func (t *HTime) UnmarshalJSON(data []byte) (err error) {
now, err := time.ParseInLocation(`"`+formatTime+`"`, string(data), time.Local)
*t = HTime{Time: now}
return
}
func (t HTime) Value() (driver.Value, error) {
var zeroTime time.Time
if t.Time.UnixNano() == zeroTime.UnixNano() {
return nil, nil
}
return t.Time, nil
}
func (t *HTime) Scan(v interface{}) error {
value, ok := v.(time.Time)
if ok {
*t = HTime{Time: value}
return nil
}
return fmt.Errorf("can not convert %v to timestamp", v)
}
注意:
1、重新定义HTime结构体,对序列化方法进行调整。
2、Student结构体中UpdateTime字段数据类型调整为HTime,调整后如下。
type Student struct {
Id int32 `json:"id" gorm:"column:id;primary_key;AUTO_INCREMENT;comment:'id'"`
Name string `json:"name" gorm:"column:name;type:varchar(255);comment:'名字'"`
Age int64 `json:"age" gorm:"column:age;comment:'年龄'"`
Content string `json:"content" gorm:"column:content;type:varchar(255);comment:'描述'"`
UpdateTime constants.HTime `json:"update_time" time_format:"unix" gorm:"column:update_time"`
DelFlag int64 `json:"del_flag" gorm:"column:del_flag;comment:'删除标识'"`
}接口验证
controller层增加接口代码,如下:
//新增或者修改一个学生信息
func (s StudentController) AddOrUpdateStudent(context *gin.Context) {
var addOrUpdateStudent db_entity.Student
log.Logger.Info("AddOrUpdateStudent接口")
if err := context.ShouldBindJSON(&addOrUpdateStudent); err != nil {
log.Logger.Panic("参数异常")
}
if _, err := json.Marshal(addOrUpdateStudent); err != nil {
log.Logger.Panic("参数解析异常")
}
_rsp := services.StudentServ.AddOrUpdateStudent(&addOrUpdateStudent)
context.JSON(http.StatusOK, _rsp)
}
//查询所有学生
func (s StudentController) SelectAll(context *gin.Context) {
log.Logger.Info("SelectAll接口")
_rsp := services.StudentServ.SelectAll()
context.JSON(http.StatusOK, _rsp)
}
//根据id删除学生
func (s StudentController) DeleteById(context *gin.Context) {
log.Logger.Info("DeleteById接口")
_id := context.Query("id")
_a, _ := strconv.ParseInt(_id, 10, 64)
_rsp := services.StudentServ.DeleteById(int32(_a))
context.JSON(http.StatusOK, _rsp)
}router增加路由路径,如下:
func StudentRouter(r *gin.Engine) {
r.POST("/student/addOne", controllers.StudentCtrl.StudentAddOne)
r.POST("/student/addOrUpdateStudent", controllers.StudentCtrl.AddOrUpdateStudent)
r.GET("/student/selectAll", controllers.StudentCtrl.SelectAll)
r.DELETE("/student/deleteById", controllers.StudentCtrl.DeleteById)
}
分别验证一下3个接口。
新增修改接口

![]()
查询接口

删除接口


小结
最近说实话有点忙了,在忙也要抽时间学习啊。后面继续操作一些复杂的查询操作。
参考链接:gorm time.Time 使用钩子函数解决反序列化问题_qq_26372385的博客-CSDN博客

边栏推荐
- 重回榜首的大众,ID依然乏力
- 远程办公经验?来一场自问自答的介绍吧~ | 社区征文
- Tableapi & SQL and MySQL grouping statistics of Flink
- [Cloudera][ImpalaJDBCDriver](500164)Error initialized or created transport for authentication
- Redis seckill demo
- 使用 csv 导入的方式在 SAP S/4HANA 里创建 employee 数据
- 华为发布HCSP-Solution-5G Security人才认证,助力5G安全人才生态建设
- vim 从嫌弃到依赖(22)——自动补全
- k8s部署redis哨兵的实现
- What are the EN ISO 20957 certification standards for common fitness equipment
猜你喜欢
![[target tracking] |stark](/img/e2/83e9d97cfb8c49cfb8d912cfe2f858.png)
[target tracking] |stark
k8s部署redis哨兵的实现

HR面试:最常见的面试问题和技巧性答复

OpenSSL client programming: SSL session failure caused by an insignificant function

"Qt+pcl Chapter 6" point cloud registration ICP Series 6

Junda technology - wechat cloud monitoring scheme for multiple precision air conditioners

Summary of point cloud reconstruction methods I (pcl-cgal)

华为发布HCSP-Solution-5G Security人才认证,助力5G安全人才生态建设
Implementation of deploying redis sentry in k8s

Zhang Chi Consulting: household appliance enterprises use Six Sigma projects to reduce customers' unreasonable return cases
随机推荐
"Qt+pcl Chapter 6" point cloud registration ICP Series 6
Lean Six Sigma project counseling: centralized counseling and point-to-point counseling
SQL常用的四个排序函数梳理
[Cloudera][ImpalaJDBCDriver](500164)Error initialized or created transport for authentication
雷神科技冲刺北交所,拟募集资金5.4亿元
Zhang Chi Consulting: household appliance enterprises use Six Sigma projects to reduce customers' unreasonable return cases
Flink 系例 之 TableAPI & SQL 与 MYSQL 数据查询
张驰课堂:六西格玛数据的几种类型与区别
phpcms后台上传图片按钮无法点击
张驰咨询:家电企业用六西格玛项目减少客户非合理退货案例
【STM32学习】 基于STM32 USB存储设备的w25qxx自动判断容量检测
MySQL advanced 4
如何实现时钟信号分频?
【一天学awk】函数与自定义函数
Qt+pcl Chapter 6 point cloud registration ICP Series 2
[STM32 learning] w25qxx automatic judgment capacity detection based on STM32 USB storage device
【天线】【3】CST一些快捷键
[cloud trend] new wind direction in June! Cloud store hot list announced
【OpenCV 例程200篇】216. 绘制多段线和多边形
Returning to the top of the list, the ID is still weak