gorm
概述:
Gorm 是一个 Go 语言编写的 ORM库,全称为 Go Object - Relational Mapping。它提供了一种方便的方式来将 Go 语言中的结构体和数据库中的表进行映射,使得开发者可以使用面向对象的方式来操作数据库,而无需编写大量的 SQL 语句。
说明:我们就来使用Mysql作为本次的数据库,通过对user_info表的增删改查来讲解。下面是表的创建:
CREATE TABLE user_info (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
age INT
);
1、连接数据库:
我们要知道我们的数据库配置文件
eg:"username:password@tcp(hostname:port)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
username:
数据库连接的用户名
password:
数据库连接的密码
hostname:
数据库连接的主机地址,通常默认为127.0.0.1
port:
数据库连接的端口号,通常默认为3306
dbname:
这是我们要连接的数据库名
其他:
就是我们的编码格式以及其他配置信息
-
在连接数据库之前,我们首先要安装两个数据库相关的包:
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
我们只需要在对应Go文件命令行输入,然后回车即可
-
下面我们要创建一个数据库初始化,用于连接我们的数据库。命名为MySqlUtil.go
- 使用gorm.Open方法建立与数据库的连接
- 将连接的数据库赋值给DB变量
type mySqlUtil struct { DB *gorm.DB } //全局变量, 外部使用utils.MySqlClient来访问 var MySqlClient mySqlUtil func InitMySqlUtil() error { dsn := "username:password@tcp(hostname:port)/dbname?charset=utf8mb4&parseTime=True&loc=Local" dd, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { panic("[SetupDefaultDatabase#newConnection error]: " + err.Error() + " " + dsn) } sqlDB, err := dd.DB() if err != nil { panic("[SetupDefaultDatabase#newConnection error]: " + err.Error() + " " + dsn) } //初始化全局redis结构体 MySqlClient = mySqlUtil{DB: dd} return nil }
-
创建一个与数据库相对应的表结构
package models //数据库表结构 type UserInfo struct { Id int `gorm:"primaryKey;autoIncrement" form:"id"` Name string `form:"name"` Age int `form:"age"` } // 自定义表名(和数据库一样) func (UserInfo) TableName() string { return "user_info" } -
我们创建一个用户增删改查的“类”:
-
UpdateUserName :UPDATE user_info SET name = '具体的name值' WHERE id = '具体的id值';
-
GetUserPageList:SELECT * FROM user_info WHERE age < 20 LIMIT size OFFSET index * size;
这里我们就写出了两种方法(更新和查找),剩下的两种与其相似;
-
type UserInfoDao struct {
}
var UserInfo = UserInfoDao{}
// Model() 方法主要用于指定后续数据库操作所针对的模型(通常是一个结构体,该结构体与数据库表结构有对应关系)
func (UserInfoDao) UpdateUserName(name string, id int) error {
err := utils.MysqlClient.DB.Model(&models.UserInfo{}).Where("id = ?", id).Update("name", name).Error
return err
}
func (UserInfoDao) GetUserPageList(index int, size int) ([]models.UserInfo, error) {
results := make([]models.UserInfo, 0)
err := utils.MysqlClient.DB.Model(&models.UserInfo{}).Where("age < ?", 20).Limit(size).Offset(index * size).Find(&results).Error
return results, err
}
-
创建好之后,我们就可以就可以在main.go中去初始化我们的数据库:
- 我们使用gin.Default()创建了一个server
- 端口号为9090
func main() { utils.InitMySqlUtil() //创建一个默认的路由引擎 engine := gin.Default() routers.RegisterRouter(engine) engine.Run(":9090") }
-
下面,我们就可以在controller中去调用对应的方法:
type UserController struct { } // 分页查询 func (controller *UserController) GetPageList(context *gin.Context) { index, _ := strconv.Atoi(context.Query("index")) println("index:", index) size, _ := strconv.Atoi(context.Query("size")) list, _ := dao.UserInfo.GetUserPageList(index, size) context.JSON(http.StatusOK, gin.H{ "users": list, }) } // 根据id更新name func (controller *UserController) UpdateUserName(context *gin.Context) { name := context.PostForm("name") println("name:", name) id, _ := strconv.Atoi(context.PostForm("id")) _ = dao.UserInfo.UpdateUserName(name, id) context.JSON(http.StatusOK, gin.H{ "code": 1, }) }以上就是Gorm的全部内容,如果代码有看不懂的地方,或者不知道另外两种方法不知道如何去写,我们可以去豆包MarsCode进行提问,豆包MarsCode讲给你一个更加详细的讲解;