gorm是什么?
gorm:一个Go语言开发的对象关系映射(ORM)库,它提供了一种简单而强大的方式来操作数据库。ORM 是一种编程技术,它允许开发人员使用面向对象的方式来操作数据库,而不需要直接编写 SQL 查询语句。
gorm的主要功能包括
-
数据库驱动支持: GORM 支持多种数据库,包括 MySQL、PostgreSQL、SQLite、SQL Server 等。
-
定义模型: 使用 GORM,开发人员可以定义 Go 结构体来表示数据库中的表,每个结构体字段对应表中的一个列。
-
自动迁移: GORM 提供了自动迁移功能,可以根据模型定义自动创建或更新数据库表结构。
-
查询构建器: GORM 提供了强大的查询构建器,可以轻松地构建复杂的数据库查询操作,支持链式调用、条件筛选、预加载等功能。
-
事务支持: GORM 支持事务操作,可以确保数据库操作的原子性和一致性。
-
钩子函数: GORM 提供了钩子函数机制,可以在数据创建、更新、删除等操作前后执行自定义的逻辑。
-
关联关系: GORM 支持定义和处理不同表之间的关联关系,包括一对一、一对多、多对多等关系。
总的来说,GORM 简化了在 Go 语言中与数据库交互的过程,使得开发人员可以更加专注于业务逻辑的实现,而不需要关注底层的 SQL 查询语句。
gorm使用流程
1:gorm导入
go get gorm.io/gorm
2:导入数据库驱动
//终端下载mysql的驱动:
go get gorm.io/driver/mysql
3:连接mysql数据库
func Init() error {
var err error
username := "root" //数据库用户名
password := "root" //数据库密码
host := "127.0.0.1" //数据库主机号
part := 3306 //数据库端口号
Dbname := "gorm" //数据库名称
//root:root@tcp(127.0.0.1:3306)/gorm?
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s? charset=utf8mb4&parseTime=True&loc=Local",username,password,host,part, Dbname)
//连接MYSQL,获得DB类型实例,用于后面的数据库读写操作
db, err := gorm.Open(mysql.Open(dsn))
if err != nil {
panic("数据库连接失败,err=" + err.Error())
}
//连接成功
fmt.Println(db)
sqlDB, _ := db.DB()
sqlDB.SetMaxIdleConns(2) //设置连接池,空闲
sqlDB.SetMaxOpenConns(5) //设置打开最大连接
if err=sqlDB.Close();err != nil {
log.Println("数据库关闭失败")
return err
}
return nil
}
4:数据库迁移映射
1,数据库字段迁移映射
这个gorm.Model
是自动加上 Id ,create_time
,update_time
,delete_time
创建用户表user和评论表comment
type User struct {
gorm.Model
Username string `json:"username" gorm:"unique;comment:用户登录名"`
Password string `json:"password" gorm:"comment:用户登录密码"`
Avatar string `gorm:"size:1000"`
Email string `json:"email" gorm:"comment:用户邮箱"`
}
// 设置 User 模型对应的表名为 "sys_users"
func (User) TableName() string {
return "sys_users"
}
type Comment struct {
gorm.Model
UserID uint `json:"user_id" gorm:"comment:用户id;foreignKey:fk_uid"`
Content string `json:"content" gorm:"comment:评论内容"`
CommentTime string `json:"comment_time" gorm:"comment:评论时间"`
}
// 设置 Comment 模型对应的表名为 "sys_comments"
func (Comment) TableName() string {
return "sys_comments"
}
2,数据库模型迁移
func migration() {
// 自动迁移模式
DB.Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4").
AutoMigrate(&User{})
// 自动迁移模式
DB.Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8mb4").
AutoMigrate(&Comment{})
}
添加外键
func AddForeignKey() error {
return DB.Exec("ALTER TABLE comments ADD CONSTRAINT fk_uid FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE RESTRICT ON UPDATE RESTRICT").Error
}
5:gorm操作数据库(增删改查)
1,增加用户
var user model.User
user := &model.User{
UserId: uid,
Username: p.Username,
Password: p.Password,
Gender: p.Gender,
Email: p.Email,
}
Db.Where("username = ?", p.Username).First(&user)
if user.ID>0{
log.Println("用户名已存在", zap.Error(err))
return
}
if err = DB.Create(&user).Error; err != nil {
log.Println("DB.Create(&user).Error", zap.Error(err))
return
}
2,删除用户
单个用户的删除(根据用户id)
var user model.User
err := model.DB.First(&user, ID).Error //根据id找到这个user,记得传地址。
//然后进行删除
err = model.DB.Delete(&user).Error
批量删除
db.Where("email like ? ","%123%").Delete(User{})
3,修改用户
- Save 会保存所有的字段,即使字段是
零值
- Update 当使用
Update
更新单个列时,需要指定条件 - Updates批量更新,只会更新指定字段,但如果是
空值
的情况下是不更新
的成空值的。
//Save 会保存所有的字段,即使字段是零值
var user model.User
user := &model.User{
UserId: uid,
Username: p.Username,
Password: p.Password,
Gender: p.Gender,
Email: p.Email,
}
err := model.DB.Save(&user).Error
//Update 当使用Update更新单个列时,需要指定条件
model.DB.Model(model.User{}).Where("id=?", id).Update("email", email)
4,查找用户
First
是找到第一个Last
是找到最后一个Find
是找到全部
//查询第一个
var u1 User
db.First(&u1)
fmt.Println(u1)
//查询最后一个
db.Last(&u1)
fmt.Println(u1)
//按主键获取
db.First(&u1,2) //不指定的话,默认主键是id=2
fmt.Println(u1)
//获取所有数据
db.Find(&u1) //查询所有的数据信息
fmt.Println(u1)
where条件查询
//单一条件查询
var u2 User
db.Where("username = ?","张三").First(&u2)
fmt.Println(u2)
//模糊查询
db.Where("username LIKE ?","张%").Find(&u2) //返回username姓张的所有数据
fmt.Println(u2)
查多个用Preload
预加载
var comment []model.Comment
model.DB.Model(&comment).Preload("Children").Find(&comment)