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)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/67529.html