北京企业建站哪家好,wordpress安装提示500,ppt模板下载完整版,滨州正规网站建设哪家好GORM 简单介绍 GORM 是 Golang 的一个 orm 框架。简单说#xff0c;ORM 就是通过实例对象的语法#xff0c;完成关系型数据库的操作的技术#xff0c;是对象-关系映射#xff08;Object/Relational Mapping#xff09; 的缩写。使用 ORM框架可以让我们更方便…GORM 简单介绍 GORM 是 Golang 的一个 orm 框架。简单说ORM 就是通过实例对象的语法完成关系型数据库的操作的技术是对象-关系映射Object/Relational Mapping 的缩写。使用 ORM框架可以让我们更方便的操作数据库。 GORM 官方支持的数据库类型有 MySQL, PostgreSQL, SQlite, SQL Server 特性
• 全功能 ORM
• 关联 (Has OneHas ManyBelongs ToMany To Many多态单表继承)
• CreateSaveUpdateDeleteFind 中钩子方法
• 支持 Preload、Joins 的预加载
• 事务嵌套事务Save PointRollback To Saved Point
• Context、预编译模式、DryRun 模式
• 批量插入FindInBatchesFind/Create with Map使用 SQL 表达式、Context Valuer 进
行 CRUD
• SQL 构建器Upsert数据库锁Optimizer/Index/Comment Hint命名参数子查询
• 复合主键索引约束
• Auto Migration
• 自定义 Logger
• 灵活的可扩展插件 APIDatabase Resolver多数据库读写分离、Prometheus…
• 每个特性都经过了测试的重重考验
• 开发者友好
GORM 指南 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.https://gorm.io/zh_CN/docs/index.html
1、安装 go get -u gorm.io/gorm go get -u gorm.io/driver/sqlite 使用go.mod管理的话可以import后在编辑器加载上述安装步骤可略
2、Gin 中使用 Gorm 连接数据库 在 models 下面新建 core .go 建立数据库链接 这段代码是在使用 Golang 中的 GORM 库连接到 MySQL 数据库让我来解释一下 1. dsn : 用户:密码tcp(ip数据库端口)/库名?charsetutf8mb4parseTimeTruelocLocal: 这里定义了一个数据源名称DSN包括了数据库的连接信息用户名、密码、协议tcp、地址、端口、数据库名gin以及一些连接选项charsetutf8mb4、parseTimeTrue、locLocal。 2. DB, err gorm.Open(mysql.Open(dsn), gorm.Config{}): 这一行代码使用 GORM 库中的 Open 函数来连接到 MySQL 数据库。它使用了之前定义的数据源名称 dsn并且传递了一个空的 gorm.Config{}表示使用默认配置。 在这段代码中GORM 是一个用于数据库操作的 Go 语言库而 mysql.Open(dsn) 用于指定使用 MySQL 数据库并且传递了之前定义的数据源名称。 连接成功后DB 将包含一个数据库连接对象err 将包含可能出现的错误信息。 core.go
package models
//这个操作是目的连接数据库以及定义操作的是哪个库内的表
import (// 我们使用了go.mod来管理包fmtgorm.io/driver/mysqlgorm.io/gorm
)// ----如果要全局使用数据库需要先定义
var DB *gorm.DB
var err errorfunc init(){// 连接数据库// gin是你要选择的操作的库dsn : root:Hszp123tcp(127.0.0.1:3306)/gin?charsetutf8mb4parseTimeTruelocLocalDB, err gorm.Open(mysql.Open(dsn), gorm.Config{})// 上面不用冒号因为上面已经定义了直接赋值了if err ! nil {fmt.Println(err)
}
} 3、定义操作数据库的模型
约定 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.https://gorm.io/zh_CN/docs/conventions.html 虽然在 gorm 中可以指定字段的类型以及自动生成数据表但是在实际的项目开发中我们是先设计数据库表然后去实现编码的。
在实际项目中定义数据库模型注意以下几点
1、结构体的名称必须首字母大写 并和数据库表名称对应。例如表名称为 user 结构体名称定义成 User表名称为 article_cate 结构体名称定义成 ArticleCate
2、结构体中的字段名称首字母必须大写并和数据库表中的字段一一对应。例如下面结构体中的 Id 和数据库中的 id 对应,Username 和数据库中的 username 对应Age 和数据库中的 age 对应Email 和数据库中的 email 对应AddTime 和数据库中的 add_time 字段对应
3、默认情况表名是结构体名称的复数形式。如果我们的结构体名称定义成 User表示这个模型默认操作的是 users 表。
4、我们可以使用结构体中的自定义方法 TableName 改变结构体的默认表名称如下:
func (User) TableName() string {return user}
表示把 User 结构体默认操作的表改为 user 表
定义 user 模型
package models
// 定义的结构体要和数据库的表名字一致且里面的字段要和数据库的字段一致且大写
type User struct { //默认情况表名是结构体名称的复数形式比如这个就是操作的表为usersId intUsername stringAge intEmail stringAddTime int
}// TableName 表示配置操作数据库的表名称
func (user User) TableName() string {return user
}我们准备测试的数据库 4、全部查找以及按照条件查找
我们依旧使用之前的模块隔离的形式使用之前的useraddcontroller.go控制器以及adminrouter.go路由 adminrouter.go
package routersimport (gindemo04/controllers/admingindemo04/middlegithub.com/gin-gonic/gin
)func AdminRoutersInit(r *gin.Engine) {//middlewares.InitMiddleware中间件adminRouters : r.Group(/admin, middle.InitMiddleware){adminRouters.GET(/, admin.IndexController{}.Index)adminRouters.GET(/user, admin.UserAddController{}.Index)adminRouters.GET(/user/add, admin.UserAddController{}.Add)adminRouters.GET(/user/edit, admin.UserAddController{}.Edit)adminRouters.GET(/user/delete, admin.UserAddController{}.Delete)}
}package adminimport (fmtgindemo04/modelsnet/httpospathstrconvgithub.com/gin-gonic/gin
)type UserAddController struct {BaseController
}func (con UserAddController) Index(c *gin.Context) {// 1、查询数据库userList : []models.User{}// FIND方法可以获取表内数据然后赋值给userlist切片models.DB.Find(userList) c.JSON(http.StatusOK, gin.H{result : userList,})
}
这段代码是使用 Golang 中的 Gin 框架和 GORM 库从数据库中检索用户数据并将其作为 JSON 响应返回。
1. userList : []models.User{}: 在这一行中定义了一个空的 userList 切片用于存储从数据库中检索到的用户数据。
2. models.DB.Find(userList): 这一行代码使用 GORM 库中的 Find 方法从数据库中检索用户数据并将结果存储到 userList 中。models.DB 表示之前连接到数据库的 GORM 对象.Find 方法用于执行查询操作userList 传递了切片的指针以便查询结果可以被存储到切片中。
3. c.JSON(http.StatusOK, gin.H{result : userList}): 最后一行代码使用 Gin 框架中的 c.JSON 方法将查询结果作为 JSON 格式的响应返回。http.StatusOK 表示 HTTP 状态码为 200gin.H{result : userList} 创建了一个包含查询结果的 JSON 对象其中键为 result值为查询到的用户列表。 从数据库中检索用户数据将其作为 JSON 格式的响应返回给客户端。 按照条件查找
查找年龄大于10的
package adminimport (fmtgindemo04/modelsnet/httpospathstrconvgithub.com/gin-gonic/gin
)type UserAddController struct {BaseController
}func (con UserAddController) Index(c *gin.Context) {// 2、按照条件进行查找age10userList : []models.User{}models.DB.Where(age ?,10).Find(userList)c.JSON(http.StatusOK, gin.H{result : userList,})}
1. userList : []models.User{}: 在这一行中定义了一个空的 userList 切片用于存储从数据库中检索到的用户数据。
2. models.DB.Where(age ?,10).Find(userList): 这一行代码使用 GORM 库中的 Where 方法指定了筛选条件即年龄大于 10然后使用 Find 方法从数据库中检索符合条件的用户数据并将结果存储到 userList 中。models.DB 表示之前连接到数据库的 GORM 对象.Where(age ?,10) 指定了筛选条件Find 方法用于执行查询操作userList 传递了切片的指针以便查询结果可以被存储到切片中。
3. c.JSON(http.StatusOK, gin.H{result : userList}): 最后一行代码使用 Gin 框架中的 c.JSON 方法将查询结果作为 JSON 格式的响应返回。http.StatusOK 表示 HTTP 状态码为 200gin.H{result : userList} 创建了一个包含查询结果的 JSON 对象其中键为 result值为查询到的用户列表。 5、添加数据操作 实例化按照结构体内的数据
package adminimport (fmtgindemo04/modelsnet/httpospathstrconvgithub.com/gin-gonic/gin
)type UserAddController struct {BaseController
}func (con UserAddController) Add(c *gin.Context) {// c.HTML(http.StatusOK, admin/useradd.html, gin.H{})// //3、增加数据user : models.User{Id: 7,Username: 芭乐,Age: 19,Email: 12213qq.com,AddTime: int(models.GetUnix()),}// 将数据插入到数据库中models.DB.Create(user)c.JSON(http.StatusOK, gin.H{result : 添加成功,})
} 6、更新数据save
查询 | GORM - The fantastic ORM library for Golang, aims to be developer friendly.https://gorm.io/zh_CN/docs/query.html package adminimport (fmtgindemo04/modelsnet/httpospathstrconvgithub.com/gin-gonic/gin
)type UserAddController struct {BaseController
}}
func (con UserAddController) Edit(c *gin.Context) {
// //6、更新数据//6.1查询id5的数据user : models.User{Id: 5}models.DB.Find(user)fmt.Println(user)c.JSON(http.StatusOK, gin.H{result : user,
})
// //6.2更新数据(sava表示保存所有数据)user.Username 莫比---1models.DB.Save(user)c.JSON(http.StatusOK, gin.H{result : 修改成功,})
} 更新操作的单列形式
package adminimport (fmtgindemo04/modelsnet/httpospathstrconvgithub.com/gin-gonic/gin
)type UserAddController struct {BaseController
}func (con UserAddController) Edit(c *gin.Context) {user : models.User{}//id 这是占位符models.DB.Model(user).Where(id ?, 5).Update(username, 莫比)c.JSON(http.StatusOK, gin.H{result : 修改成功,})
} 7、删除操作 where后面跟的字段要和数据库内字段匹配而上面的修改操作需要和定义的结构体自动匹配两个不一样 package adminimport (fmtgindemo04/modelsnet/httpospathstrconvgithub.com/gin-gonic/gin
)type UserAddController struct {BaseController
}
func (con UserAddController) Delete(c *gin.Context) {//8、进行删除操作(where后面跟的字段要和数据库内字段匹配而上面的修改操作需要和定义的结构体自动匹配两个不一样)user : models.User{}models.DB.Where(id ?, 5).Delete(user)c.JSON(http.StatusOK, gin.H{result : 删除成功,})}