跟着文档走
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
- }
- }
构造体创建出来的表
