当前位置:网站首页>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博客
边栏推荐
- 《QT+PCL第六章》点云配准icp系列3
- Intelligent operation and maintenance practice: banking business process and single transaction tracking
- 关于用 ABAP 代码手动触发 SAP CRM organization Model 自动决定的研究
- 如何实现时钟信号分频?
- Deep operator overloading (2)
- Junda technology indoor air environment monitoring terminal PM2.5, temperature and humidity TVOC and other multi parameter monitoring
- TS reports an error don't use 'object' as a type The `object` type is currently hard to use
- ABAP-调用Restful API
- Rhcsa fourth day operation
- Survey of intrusion detection systems:techniques, datasets and challenges
猜你喜欢
Wechat applet 03 - text is displayed from left to right, and the block elements in the line are centered
Don't ask me again why MySQL hasn't left the index? For these reasons, I'll tell you all
Summary of point cloud reconstruction methods I (pcl-cgal)
雷神科技冲刺北交所,拟募集资金5.4亿元
GaussDB(for MySQL) :Partial Result Cache,通过缓存中间结果对算子进行加速
【STM32-USB-MSC问题求助】STM32F411CEU6 (WeAct)+w25q64+USB-MSC Flash用SPI2 读出容量只有520KB
她就是那个「别人家的HR」|ONES 人物
微信小程序03-文字一左一右显示,行内块元素居中
张驰课堂:六西格玛数据的几种类型与区别
The difference between arrow function and ordinary function in JS
随机推荐
What are the EN ISO 20957 certification standards for common fitness equipment
Qt+pcl Chapter 6 point cloud registration ICP series 4
JS中箭头函数和普通函数的区别
Raytheon technology rushes to the Beijing stock exchange and plans to raise 540million yuan
MySQL advanced 4
[target tracking] |stark
重回榜首的大众,ID依然乏力
Skywalking 6.4 distributed link tracking usage notes
Flink 系例 之 TableAPI & SQL 与 MYSQL 分组统计
skywalking 6.4 分布式链路跟踪 使用笔记
Tableapi & SQL and MySQL data query of Flink
Tableapi & SQL and Kafka message insertion in Flink
OpenSSL client programming: SSL session failure caused by an insignificant function
ABAP-调用Restful API
【一天学awk】函数与自定义函数
【云动向】6月上云新风向!云商店热榜揭晓
[cloud trend] new wind direction in June! Cloud store hot list announced
《QT+PCL第六章》点云配准icp系列2
【显存优化】深度学习显存优化方法
远程办公经验?来一场自问自答的介绍吧~ | 社区征文