使用GORM操作数据库 | 青训营

100 阅读3分钟

前言

本篇笔记主要根据后端青训营数据库相关课程以及课外查阅的部分技术教程,记录使用 GORM连接数据库并实现增删改查操作的过程。

正文

GORM的安装与导入

命令行使用do get命令下载需要的依赖包

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

项目go文件内使用import关键字导入依赖包

import (
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
    "gorm.io/gorm/schema"
)

连接数据库

下载需要连接的数据库对应的依赖包,如上文中的"gorm.io/driver/mysql"对应的是mysql数据库。

根据用户名、密码、数据库运行的IP和端口号和数据库名称等信息配置数据源名称。使用gorm连接数据库并可通过gorm进行一些高级配置,例如将schema.NamingStrategy中的SingularTable字段配置为true可以解决查表时会自动为表名添加复数的问题。

    dsn := "username:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
        NamingStrategy: schema.NamingStrategy{
            SingularTable: true,
        },
    })

创建连接池

数据库连接池可以复用创建好的数据库连接,省略创建和销毁数据库连接的过程,提高性能。可以通过SetMaxIdleConns()设置空闲连接池中连接的最大数量;SetMaxOpenConns()设置打开数据库连接的最大数量;SetConnMaxLifetime()设置连接可复用的最大时间。

    sqlDB, err := db.DB()
    sqlDB.SetMaxIdleConns(10)
    sqlDB.SetMaxOpenConns(100)
    sqlDB.SetConnMaxLifetime(10 * time.Second)

创建结构体并绑定数据库表

结构体嵌入gorm.Model可以为结构体添加ID, CreatedAt, UpdatedA, DeletedAt四个字段,db.AutoMigrate()会根据传入的结构体类型在初次运行时创建(首字母转为小写,不同单词间以下划线分隔的)同名数据库表。后续操作均以操作user表为例。

    type User struct {
        gorm.Model
        Name    string `gorm:"type:varchar(20); not null"`
        Address string `gorm:"type:varchar(200); not null"`
    }
    db.AutoMigrate(&User{})

增加数据

首先创建一条结构体数据,使用db.Create()插入一条数据到该结构体类型的对应的数据库表中。

    var user User = User{Name: "王五", Address: "陕西西安"}
    db.Create(&user)

删除数据

定义一个列表存储查询结果,使用db.Where().Find()根据传入条件查询结果并保存到列表中,使用db.Delete()删除列表中对应的数据。

    var userList []User
    id := 3
    db.Where("id = ?", id).Find(&userList)
    if len(userList) > 0 {
        db.Delete(&userList)
    }

修改数据

首先创建一条结构体数据,指定字段值。使用db.Where().Updates()根据指定条件查询并根据传入内容更新该数据。

    var user User = User{Name: "李四", Address: "陕西西安"}
    id := 3
    db.Where("id = ?", id).Updates(&user)

查询数据

条件查询

指定字段值,定义查询结果列表,使用db.Where().Find()根据指定条件查询数据并保存到结果列表中。

    name := "李四"
    var userList []User
    db.Where("name = ?", name).Find(&userList)

全部查询与分页

定义查询结果列表,以及总记录数。使用db.Model().Count().Limit().Offset().Find()方法根据pageSize和offsetNum实现分页查询。

    var userList []User
    var total int64
    db.Model(userList).Count(&total).Limit(pageSize).Offset(offsetNum).Find(&userList)

结语

本文只记录了使用GORM操作mysql数据库的基础操作,事实上GORM支持对数据库进行极为丰富的操作,在实际业务中需要用到其他用法时可以参考GORM文档。