gorm是基于golang实现的可插拔的orm框架,将model与表进行一一关联后,可以通过struct来管理数据库中的数据。gorm提供了对多种数据库的支持,包括Mysql、SQLite、SQLServer、PostgreSQL等。目前gorm已成为golang web 开发中对数据管理的首选插件,相较于比它更早时期的xorm,gorm具有活跃的社区、稳定的性能。
本文以MySQL作为数据库,进行相关功能的测试,官方文档地址:gorm.io/zh_CN/docs/
安装
# 安装 gorm
go get -u gorm.io/gorm
# 安转 mysql 驱动
go get -u gorm.io/driver/mysql
如何通过表生成gorm中的model
可以使用在线工具 www.printlove.cn/tools/sql2g… 进行转化
数据库连接
在数据库连接中可以设置连接地址、密码、连接池大小等
package models
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
var DB = Init()
func Init() *gorm.DB {
dsn := "user:passport@tcp(192.168.1.1:3306)/db_name?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Println("gorm Init Error : ", err)
}
sqlDB, err := db.DB()
// SetMaxIdleConns 设置空闲连接池中连接的最大数量
sqlDB.SetMaxIdleConns(10)
// SetMaxOpenConns 设置打开数据库连接的最大数量
sqlDB.SetMaxOpenConns(100)
return db
}
定义用于测试的表
用户表
CREATE TABLE `user_basic` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`identity` varchar(36) DEFAULT NULL COMMENT '唯一标识',
`name` varchar(100) DEFAULT NULL COMMENT '名称',
`password` varchar(32) DEFAULT NULL COMMENT '密码',
`phone` varchar(20) DEFAULT NULL COMMENT '手机号',
`mail` varchar(100) DEFAULT NULL COMMENT '邮箱',
`pass_num` int(11) DEFAULT '0' COMMENT '完成问题的个数',
`submit_num` int(11) DEFAULT '0' COMMENT '总提交次数',
`is_admin` tinyint(1) DEFAULT '0' COMMENT '是否是管理员【0-否,1-是】',
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
`deleted_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
定义model
user_basic.go
package models
import (
"gorm.io/gorm"
"time"
)
type UserBasic struct {
ID uint `gorm:"primarykey;" json:"id"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `gorm:"index;" json:"deleted_at"`
Identity string `gorm:"column:identity;type:varchar(36);" json:"identity"` // 用户的唯一标识
Name string `gorm:"column:name;type:varchar(100);" json:"name"` // 用户名
Password string `gorm:"column:password;type:varchar(32);" json:"password"` // 密码
Phone string `gorm:"column:phone;type:varchar(20);" json:"phone"` // 手机号
Mail string `gorm:"column:mail;type:varchar(100);" json:"mail"` // 邮箱
PassNum int64 `gorm:"column:pass_num;type:int(11);" json:"pass_num"` // 通过的次数
SubmitNum int64 `gorm:"column:submit_num;type:int(11);" json:"submit_num"` // 提交次数
IsAdmin int `gorm:"column:is_admin;type:tinyint(1);" json:"is_admin"` // 是否是管理员【0-否,1-是】
}
func (table *UserBasic) TableName() string {
return "user_basic"
}
单表查询
- 查询单条数据使用 First
data := new(models.UserBasic)
err := models.DB.Where("identity = ? ", "identity").First(&data).Error
if err != nil {
println(err)
}
- 查询多条数据使用 Find
data := make([]models.UserBasic, 0)
err := models.DB.Where("identity = ? ", "identity").Find(&data).Error
if err != nil {
println(err)
}
- 查询指定的字段使用 Select
data := make([]models.UserBasic, 0)
err := models.DB.Select("name").Where("identity = ? ", "identity").Find(&data).Error
if err != nil {
println(err)
}
数据创建
使用 Create 创建数据
data := &models.UserBasic{
Identity: "identity",
Name: "name",
Password: "password",
Phone: "13300000000",
Mail: "xxxx@qq.com",
}
err = models.DB.Create(data).Error
if err != nil {
println(err)
}
数据更新
使用 Updates 更新数据,默认值不更新
data := &models.UserBasic{
Identity: "identity",
Name: "name",
Password: "password",
Phone: "13300000000",
Mail: "xxxx@qq.com",
}
err = models.DB.Where("identity = 'identity'").Updates(data).Error
if err != nil {
println(err)
}
数据删除
使用 Delete() 进行数据的删除,如果需要永久删除,使用 Unscoped() 函数
// 假删除
err = models.DB.Where("identity = 'identity'",).Delete(new(models.UserBasic)).Error
// 真删除
// err = models.DB.Where("identity = 'identity'",).Unscoped().Delete(new(models.UserBasic)).Error
if err != nil {
println(err)
}