gorm使用指南(简单入门)

gorm使用指南(简单入门)gorm 是什么 gorm 一个 Go 语言开发的对象关系映射 ORM 库 它提供了一种简单而强大的方式来操作数据库 ORM 是一种编程技术 它允许开发人员使用面向对象的方式来操作数据库 而不需要直接编写 SQL 查询语句 gorm 的主要功能包括 数据库驱动支持

大家好,我是讯享网,很高兴认识大家。

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_timeupdate_timedelete_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)

小讯
上一篇 2025-03-17 19:45
下一篇 2025-01-08 11:55

相关推荐

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