GORM 简单使用实现:查询功能,添加功能

GORM 简单介绍

GORM是Golang的一个orm框架。

简单说,GORM 就是通过实例对象的语法,完成关系型数据库的操作的技术,

是"对象-关系映射"(Object/Relational Mapping)的缩写。

使用ORM框架可以让我们更方便的操作数据库。

GORM官方支持的数据库类型有:

MISQL, PostgreSQL, SQlite, SQL Server

https://gorm.io/zh_CN/

在实际项目中定义数据库模型注意以下几点:

1、结构体的名称必须首字母大写,并和数据库表名称对应。

例如:表名称为user结构体;

名称定义成User,表名称为 article_cate结构体名称定义成ArticleCate

2、结构体中的字段名称首字母必须大写,并和数据库表中的字段一一对应。

例如:下面结构体中的Id和数据库中的 id 对应,

Username和数据库中的username 对应,

Age和数据库中的age对应,

Email 和数据库中的email对应,

AddTime和数据库中的add_time字段对应

3、默认情况表名是结构体名称的复数形式。

如果我们的结构体名称定义成User,

表示这个模型默认操作的是users表。

实现查询某个库中的表

modules\connectMySQL.go

复制代码
package modules

import (
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

var DB *gorm.DB
var err error

func init() {
	// 请替换为你的实际数据库信息
	// parseTime=True 和 loc=Local 确保时间类型能正确解析
	// zhangsan123 是数据库密码,根据实际情况修改
	// school 是数据库名称,根据实际情况修改
	dsn := "root:zhangsan123@tcp(127.0.0.1:3306)/school?charset=utf8mb4&parseTime=True&loc=Local"
	DB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		panic("failed to connect database: " + err.Error())
	}
}

引入并且安装

https://gorm.io/zh_CN/docs/

复制代码
go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite

然后执行

复制代码
go mod tidy

modules\class.go

复制代码
package modules

type Class struct {
	ID    int
	Name  string
	Email string
	Score int
}

func (Class) TableName() string {
	return "class"
}

这个Class 结构体中的数据和数据库中的结构体数据要保持一致的哈

main.go

复制代码
package main

import (
	"gin-quickstart/modules"
	"gin-quickstart/routers"

	"github.com/gin-contrib/sessions"
	"github.com/gin-contrib/sessions/cookie"
	"github.com/gin-gonic/gin"
)

// "gin-quickstart/routers" 表示引入 routers 包(也就是引入我们创建的路由文件夹),用于注册路由

func main() {
	// 创建一个默认的路由引擎
	r := gin.Default()
	// 配置session中间件,基于cookie存储引擎
	store := cookie.NewStore([]byte("miYao"))
	r.Use(sessions.Sessions("mysession", store))
	// 允许跨域中间件(注意:必须写在路由注册【之前】才对已注册路由生效)
	r.Use(func(c *gin.Context) {
		c.Header("Access-Control-Allow-Origin", "*") // 允许所有来源(学习阶段够用)
		c.Header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
		c.Header("Access-Control-Allow-Headers", "Content-Type")
		// 浏览器发复杂请求前会先发 OPTIONS 预检,直接放行
		if c.Request.Method == "OPTIONS" {
			c.AbortWithStatus(204)
			return
		}
		c.Next()
	})

	// 注册用户路由,routers表示的是路由包,
	// UserRouters表示的是路由函数(也就是这个包中user.go文件中的函数)
	routers.UserRouters(r)

	r.GET("/session/set", func(c *gin.Context) {
		session := sessions.Default(c)
		// 设置session
		session.Set("sessionID", "zs20161016")
		// 保存session,这一步是必须的哈
		session.Save()
		c.JSON(200, gin.H{
			"msg": "hello gin",
		})
	})

	r.GET("/session/get", func(c *gin.Context) {
		session := sessions.Default(c)
		// 获取session:Get 只返回一个值,取不到时返回 nil
		sessionID := session.Get("sessionID")
		c.JSON(200, gin.H{
			// 转换为字符串类型
			"msg": "sessionID: " + sessionID.(string),
		})
	})
    
    // 查询
	r.GET("/class", func(c *gin.Context) {
		classList := []modules.Class{}
		modules.DB.Find(&classList)
		c.JSON(200, gin.H{
			"msg":  "获取班级列表成功",
			"list": classList,
		})
	})

	// 启动服务,端口为8080,当然你也可以更改的哈
	r.Run(":8087")
}

http://localhost:8087/class

实现添加功能

复制代码
package main

import (
	"gin-quickstart/modules"
	"gin-quickstart/routers"

	"github.com/gin-contrib/sessions"
	"github.com/gin-contrib/sessions/cookie"
	"github.com/gin-gonic/gin"
)

// "gin-quickstart/routers" 表示引入 routers 包(也就是引入我们创建的路由文件夹),用于注册路由

func main() {
	// 创建一个默认的路由引擎
	r := gin.Default()
	// 配置session中间件,基于cookie存储引擎
	store := cookie.NewStore([]byte("miYao"))
	r.Use(sessions.Sessions("mysession", store))
	// 允许跨域中间件(注意:必须写在路由注册【之前】才对已注册路由生效)
	r.Use(func(c *gin.Context) {
		c.Header("Access-Control-Allow-Origin", "*") // 允许所有来源(学习阶段够用)
		c.Header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS")
		c.Header("Access-Control-Allow-Headers", "Content-Type")
		// 浏览器发复杂请求前会先发 OPTIONS 预检,直接放行
		if c.Request.Method == "OPTIONS" {
			c.AbortWithStatus(204)
			return
		}
		c.Next()
	})

	// 注册用户路由,routers表示的是路由包,
	// UserRouters表示的是路由函数(也就是这个包中user.go文件中的函数)
	routers.UserRouters(r)

	r.GET("/session/set", func(c *gin.Context) {
		session := sessions.Default(c)
		// 设置session
		session.Set("sessionID", "zs20161016")
		// 保存session,这一步是必须的哈
		session.Save()
		c.JSON(200, gin.H{
			"msg": "hello gin",
		})
	})

	r.GET("/session/get", func(c *gin.Context) {
		session := sessions.Default(c)
		// 获取session:Get 只返回一个值,取不到时返回 nil
		sessionID := session.Get("sessionID")
		c.JSON(200, gin.H{
			// 转换为字符串类型
			"msg": "sessionID: " + sessionID.(string),
		})
	})

	r.GET("/addClass", func(c *gin.Context) {
        // 不需要制定id,因为id会自动新增的
		class := modules.Class{
			Name:  "周末",
			Email: "123456@163.com",
			Score: 33,
		}
		modules.DB.Create(&class)
		c.JSON(200, gin.H{
			"msg": "添加班级成功",
		})
	})

	// 启动服务,端口为8080,当然你也可以更改的哈
	r.Run(":8087")
}

查询id等于6的数据

复制代码
r.GET("/getId", func(c *gin.Context) {
		// 查询id等于6的数据
		class := modules.Class{ID: 6}
		modules.DB.Find(&class)
		c.JSON(200, gin.H{
			"msg":   "查询更改",
			"class": class,
		})
	})