04 使用 GORM连接数据库,实现增删改查操作 | 青训营

91 阅读2分钟

GORM介绍

ORM(Object Relational Mapping),意思是对象关系映射。它在关系型数据库和对象之间作一个映射,这样,在操作数据库时,就无需要再去编写复杂的SQL语句。 GORM(Go Object Relational Mapping) 是一个在 Go 语言中使用的强大的 ORM 框架,用于简化数据库操作。它允许你通过 Go 的结构体来定义数据模型,并且能够自动地将这些结构体映射到数据库表中,从而实现对象和关系型数据库之间的映射。

GORM特性

  1. 模型映射: GORM 允许你通过 Go 结构体来定义数据库表的模型。你可以在结构体上使用 struct tag 来定义表名、字段名、索引、约束等信息。
  2. 数据库迁移: GORM 提供了自动迁移的功能,可以根据定义的模型自动生成数据库表结构,从而避免手动创建表的繁琐工作。
  3. CRUD 操作: GORM 提供了丰富的方法来进行增删改查操作。你可以使用链式调用来构建查询语句,还可以使用事务来保证数据的一致性。
  4. 关联关系: GORM 支持多种类型的关联关系,如一对一、一对多、多对多等。你可以在模型中使用字段标签来定义关联关系。
  5. 事务管理: GORM 允许你使用事务来执行一系列操作,确保这些操作要么全部成功要么全部失败,以保证数据的完整性。
  6. Hooks(钩子函数): 你可以在模型上定义各种生命周期钩子函数,例如在创建、更新、删除等操作前后执行特定的逻辑。
  7. 预加载: GORM 支持预加载(Eager Loading),可以在查询数据时一次性加载相关联的数据,避免 N+1 查询问题。
  8. 原生 SQL: 尽管 GORM 提供了丰富的查询方法,但你也可以使用原生 SQL 语句来执行复杂的查询或更新操作。
  9. 数据库支持: GORM 支持多种数据库,包括但不限于 MySQL、PostgreSQL、SQLite、SQL Server 等。

使用GORM操作mysql实践

安装gorm

##gorm
go get -u gorm.io/gorm 
##数据库驱动
go get -u gorm.io/driver/mysql

导入驱动和gorm

import (
    "gorm.io/driver/mysql" // mysql 驱动包
    "gorm.io/gorm"// gorm
)

使用navicat创建user表后创建数据表对应的结构体
type User struct {  
    ID uint `gorm:"primaryKey"`  
    Username string `gorm:"unique"`  
    Email string  
    CreatedAt time.Time  
    UpdatedAt time.Time  
}

数据库链接

// 配置数据库连接  
dsn := "root:pwd@tcp(127.0.0.1:3306)/testgorm?charset=utf8mb4&parseTime=True&loc=Local"  
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{  
    Logger: logger.Default.LogMode(logger.Info),  
})  
if err != nil {  
    log.Fatal(err)  
}

增删改查

// 增加数据  
user := User{Username: "john_doe", Email: "john@example.com"}  
result := db.Create(&user)  
if result.Error != nil {  
log.Fatal(result.Error)  
}  
fmt.Println("User created:", user)  
  
// 查询数据  
var queriedUser User  
result = db.First(&queriedUser, "username = ?", "john_doe")  
if result.Error != nil {  
log.Fatal(result.Error)  
}  
fmt.Println("Queried user:", queriedUser)  
  
// 更新数据  
result = db.Model(&queriedUser).Update("Email", "updated@example.com")  
if result.Error != nil {  
log.Fatal(result.Error)  
}  
fmt.Println("User updated:", queriedUser)  
  
// 删除数据  
result = db.Delete(&queriedUser)  
if result.Error != nil {  
log.Fatal(result.Error)  
}  
fmt.Println("User deleted:", queriedUser)