跟着文档走
GORM 指南 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.
1.使用命令拉取
go get -u gorm.io/gorm go get -u gorm.io/driver/sqlite |
2.开始使用
package main
import (
"fmt"
"github.com/gin-gonic/gin"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/schema"
"net/http"
"strconv"
"time"
)
func main() {
// 创建服务
ginServer := gin.Default()
// 连接mysql
// 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
dsn := "root:zsp123456@tcp(127.0.0.1:3306)/zsp?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
// 表明复数问题
NamingStrategy: schema.NamingStrategy{SingularTable: true},
})
// 设置sql的一些属性
sqlDB, err := db.DB()
sqlDB.SetMaxIdleConns(10)
sqlDB.SetMaxOpenConns(100)
sqlDB.SetConnMaxLifetime(10 * time.Second) // 10s
//结构体,就是创建表用的,包含了name,state,phone
type List struct {
// 主键id等信息
gorm.Model
Name string `gorm:"type:varchar(20);not null" json:"name" binding:"required"`
State int `gorm:"type:int(10);not null" json:"state" binding:"required"`
Phone string `gorm:"type:varchar(50);not null" json:"phone" binding:"required"`
}
// 数据库迁移
db.AutoMigrate(&List{})
// 以上就是准备工作,下面开始crud
// CRUD
// 增加
ginServer.POST("/add", func(context *gin.Context) {
var data List
err := context.ShouldBindJSON(&data)
// 判断绑定是否有错误
if err != nil {
context.JSON(http.StatusBadRequest, gin.H{"msg": "数据有误"})
} else {
// 数据库操作 增加一条数据
db.Create(&data) // 创建一条数据
context.JSON(http.StatusOK, gin.H{
"msg": "添加成功",
"data": data,
"code": http.StatusOK,
})
}
})
// 删除
ginServer.DELETE("/delete/:id", func(context *gin.Context) {
var data []List
// 接收id
id := context.Param("id")
// 判断id是否存在
db.Where("id = ?", id).Find(&data)
// id存在则删除,不存在报错
if len(data) == 0 {
context.JSON(http.StatusOK, gin.H{
"msg": "删除失败",
"code": http.StatusBadRequest,
})
} else {
// 操作数据库删除
db.Where("id = ?", id).Delete(&data)
context.JSON(http.StatusOK, gin.H{
"msg": "删除成功",
"code": http.StatusOK,
})
}
})
//修改
ginServer.PUT("/edit/:id", func(context *gin.Context) {
var data List
// 接收id
id := context.Param("id")
// 判断id是否存在
db.Select("id").Where("id = ?", id).Find(&data)
// 判断id是否存在
if data.ID == 0 {
context.JSON(http.StatusBadRequest, gin.H{
"msg": "用户id没有找到",
})
} else {
err := context.ShouldBindJSON(&data)
if err != nil {
context.JSON(http.StatusBadRequest, gin.H{
"msg": "修改失败",
})
} else {
//db修改数据库
db.Where("id = ?", id).Updates(&data)
context.JSON(http.StatusOK, gin.H{
"msg": "修改成功",
})
}
}
})
// 查询(条件查询,全部查询/分页查询)
//条件查询
ginServer.GET("/list/:name", func(context *gin.Context) {
//获取路径参数
name := context.Param("name")
var data []List
// 查询数据库是否存在
db.Where("name = ?", name).Find(&data)
// 判断是否查询到数据
if len(data) == 0 {
context.JSON(http.StatusBadRequest, gin.H{
"msg": "没有查询到数据",
})
} else {
context.JSON(http.StatusOK, gin.H{
"msg": "查询成功",
"data": data,
})
}
})
// 分页查询
ginServer.GET("/list", func(context *gin.Context) {
var pageList []List
// 1.查询全部数据、查询分页数据
pageSize, _ := strconv.Atoi(context.Query("pageSize"))
pageNum, _ := strconv.Atoi(context.Query("pageNum"))
// 判断是否需要分页
if pageSize == 0 {
pageSize = -1
}
if pageNum == 0 {
pageNum = -1
}
offsetVal := (pageNum - 1) * pageSize
if pageNum == -1 && pageSize == -1 {
offsetVal = -1
}
// 返回一个总数
var total int64
// 查询数据库
// limit 分页 -1:查询全部数据
db.Model(pageList).Count(&total).Limit(pageSize).Offset(offsetVal).Find(&pageList)
if len(pageList) == 0 {
context.JSON(http.StatusBadRequest, gin.H{
"msg": "暂无数据",
})
} else {
context.JSON(http.StatusOK, gin.H{
"msg": "查询成功",
"data": gin.H{
"list": pageList,
"total": total,
"pageNum": pageNum,
"pageSize": pageSize,
},
"code": http.StatusOK,
})
}
})
//启动服务
err = ginServer.Run(":8082")
if err != nil {
return
}
}
构造体创建出来的表