使用 GORM(Go 的 ORM 库)连接数据库| 青训营

76 阅读2分钟

Go的三大框架

  • Gorm
    • ORM框架
  • Kitex:
    • Golang微服务RPC框架
    • 高性能、强可拓展,支持多协议
  • Hertz
    • HTTP框架
    • 高易用性、高性能、高拓展性

Gorm

数据库操作

连接数据库

  • db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})

创建数据

  • db.Create(&TypeName{Attr1: "xx", Attr2: 00})
  • clause.OnConflict 处理数据冲突
    • db.Clauses(clause.OnConflict{DoNothing: true}).Create(&p)
  • default标签为字段定义默认值
    • AttrName int64 gorm:"default:0"

查询数据

  • db.First(%buf, 1) 根据整形主键查找
  • db.First(%buf, "attr1 = ?", "xx") 查找attr1字段值为xx的记录
  • 使用First时,查询不到数据会返回ErrRecordNotFound
  • 使用Find查询多条数据,查询不到数据不会返回错误
  • 当使用结构体作为条件查询时,GORM只会查询非零值字段,应使用map来构建查询条件
    • db.Where(map[string]interface{}{"Age": 0}).Find(&users)

更新数据

  • db.Model(&buf).Update("Attr2", 11) 将buf的attr2更新为11
  • db.Model(&buf).Update(TypeName{Attr1: "aa", Attr2: 11})) 更新多个字段
  • db.Model(&buf).Update(map[string]interface{}{"Attr1": 11, "Attr2": "xx"})
  • 使用struct更新时,只会更新非零值,如果需要更新零值需使用map或select选择字段
    • db.Model(&User{ID: 111}).Select("name").Updates(map[string]interface{}{"name": "hello"})

删除数据

  • db.Delete(&buf, 1)
  • gorm.DeletedAt 用于帮助用户实现软删,记录不会从数据库中真正删除,但不能再通过正常的查询方法找到该记录
  • 使用Unscoped可以查询到被软删的数据

支持的数据库

  • 通过驱动来连接数据库,可以复用/自行开发驱动

支持的事务

  • 提供了Begin、Commit、Rollback方法用于使用事务
  • Transaction方法用于自动提交事务,以免用户漏写Commit、rollback

GORM Hook

  • Hook是在创建、查询、更新、删除等操作的前后自动调用的函数
  • 如果任何Hook返回错误,将停止后续的操作并回滚事务

性能提升

  • GORM会将写操作封装在事务内运行,为确保数据的完整性,但会降低性能,可使用SkipDefaultTransaction关闭默认事务
  • 使用PrepareStmt缓存预编译语句可以提高后续调用的速度

总结

在构建高性能、高可拓展性的系统时,选择合适的工具和框架是非常重要的。合理使用 ORM 框架、RPC 框架以及 HTTP 框架可以大幅度提高开发效率,降低系统复杂度。同时,深入了解这些工具的使用方法以及性能优化技巧,有助于构建出更加稳定、高性能的应用系统。因此,在类似场景下,选择合适的技术栈和工具、进行性能优化、保障数据一致性等方面的思考,都是构建高可用系统的关键。