Gorm实践(增删改查) | 青训营

62 阅读4分钟

简介

Gorm是一个基于Go语言的对象关系映射(ORM)框架。ORM框架用于简化数据库操作,将数据库表映射到程序中的对象,并提供了一种简洁的方式来执行数据库查询、插入、更新和删除等操作。

Gorm提供了丰富的功能,包括:

  1. 数据库驱动支持:Gorm兼容多种数据库驱动,如MySQL、PostgreSQL、SQLite等。
  2. 模型定义:您可以通过定义结构体来表示数据库表,Gorm会根据模型定义自动生成对应的数据库表结构。
  3. CRUD操作:Gorm提供了一套简洁的API,可以方便地执行创建、读取、更新和删除操作。
  4. 查询构建器:您可以使用链式调用方式构建复杂的数据库查询语句。
  5. 关联关系管理:Gorm支持定义和管理表之间的关联关系,如一对一、一对多、多对多等。
  6. 事务处理:Gorm提供了事务机制,确保在复杂操作中的数据一致性和完整性。
  7. 钩子函数:您可以在执行数据库操作前后添加自定义的钩子函数,以实现额外的逻辑。

Gorm连接数据库

只使用 Gorm,我们无法与对应的数据库建立连接,我们需要对应的数据库驱动。Gorm 官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server,我这里使用的MySql,首先需要下载需要的驱动。其他数据库根据需要的驱动进行下载。

go get gorm.io/driver/mysql
go get gorm.io/gorm

dsn代表数据库连接字符串(Data Source Name),它用于指定连接到数据库的详细信息。dsn通常包含以下参数:

  • username:这是数据库的用户名。一般来说,本地的数据库用户名为 root
  • password:这是数据库的密码。
  • "tcp(%s:%d)":这部分表示使用TCP协议连接到指定的主机和端口。在本地的 host 为:127.0.0.1 ;host 为:3306
  • Dbname:这部分表示的数据库的名称。
  • "charset=utf8mb4":这部分指定了字符集为UTF-8。
  • "parseTime=True":这部分告诉数据库驱动程序在处理时间戳时,将其解析为实际的time.Time类型。
  • "loc=Local":这部分指定了本地时区。
  • "timeout=%s":这部分指定了连接超时时间。我一般将超时时间设置为 10s 。
import (
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)

func main() {
    dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local&timeout=%s", username, password, host, port, Dbname, timeout)
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
    sqlDB, err := db.DB()  
    if err != nil {  
        return  
    }  
    // 对数据库连接的属性进行相关配置
    // SetMaxIdleConns 设置空闲连接池中连接的最大数量  
    sqlDB.SetMaxIdleConns(10)  
    // SetMaxOpenConns 设置打开数据库连接的最大数量。  
    sqlDB.SetMaxOpenConns(100)  
    // SetConnMaxLifetime 设置了连接可复用的最大时间。  
    sqlDB.SetConnMaxLifetime(10 * time.Second) //10秒钟

}

数据库表映射

我们可以通过声明一个结构体,用于Gorm与识别并自动在数据库中创建数据表。其通过tag标签对数据的每一字段进行详细的定义。

// 注意:结构体里面的变量首字母大写 ,gorm指定类型,json表示json字段名称,binding require表示必须输入  
type list struct {  
    //添加这句代码创建表时会自动添加主键,以及创建修改删除相关信息  
    gorm.Model  
    //binding:"require"是在运行时进行表单验证或数据绑定时使用的标签,而NOT NULL是在数据库定义中用于强制字段非空的静态约束。  
    Name string `gorm:"type:varchar(20);not null" json:"name" binding:"require"`  
    State string `gorm:"type:varchar(20);not null" json:"state" binding:"require"`  
    Phone string `gorm:"type:varchar(20);not null" json:"phone" binding:"require"`  
    Email string `gorm:"type:varchar(40);not null" json:"email" binding:"require"`  
    Address string `gorm:"type:varchar(200);not null" json:"address" binding:"require"`  
}

以上会创建一个名为list的数据表,我们可以修改自动生成的数据表名称

db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
  NamingStrategy: schema.NamingStrategy{
    TablePrefix:   "test_",  // 表名前缀
    SingularTable: false, // 单数表名
    NoLowerCase:   false, // 关闭小写转换
  },
})

创建数据

func Create(db *gorm.DB, list *models.list) error {
    result := db.Create(list)
    return result.Error
}

查询数据

func GetByID(db *gorm.DB, id uint) (*models.list, error) {
    var list models.list
    result := db.First(&list, id)
    return &list, result.Error
}

db.First(&record) 获取第一条记录(主键升序)

db.Take(&record) 获取一条记录,没有指定排序字段

db.Last(&record) 获取最后一条记录(主键降序)

更新数据

func Update(db *gorm.DB, list *models.list) error {
    result := db.Save(list)
    return result.Error
}

删除数据

func Delete(db *gorm.DB, list *models.list) error {
    result := db.Delete(list)
    return result.Error
}

总结

  1. 添加数据:使用DB.Create方法可以向表中添加一条记录,也可以使用切片批量插入数据。
  2. 数据查询:使用DB.Take方法可以查询一条记录,可以根据ID或条件进行查询,使用DB.Find方法可以查询多条记录,还可以根据ID列表或条件进行查询。
  3. 数据修改:使用DB.Save方法可以更新单条记录,也可以使用DB.Updates方法批量更新记录,可以选择特定属性进行更新。
  4. 数据删除:使用DB.Delete方法可以删除单条记录,也可以先进行查询再删除。