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())
}
}
引入并且安装
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")
}
实现添加功能
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,
})
})