使用 GORM(Go 的 ORM 库)连接数据库,并实现增删改查操作 | 青训营

76 阅读4分钟

1.GORM框架介绍

GORM 是 Go 语言中最受欢迎的 ORM 库之一,它提供了强大的功能和简洁的 API,让数据库操作变得更加简单和易维护。本文主要介绍GORM框架的基本使用,如何连接数据库完成增删改查操作。

2.安装

通过如下命令安装 GORM:

go get -u gorm.io/gorm

你也许见过使用 go get -u github.com/jinzhu/gorm 命令来安装 GORM,这个是老版本 v1,现已过时,不建议使用。新版本 v2 已经迁移至 github.com/go-gorm/gorm 仓库下。

3.具体代码

首先导入相关的包,然后定义结构体用来映射数据库表

package main

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

数据模型定义

表名,列名如何对应结构体

在Gorm中,表名是结构体名的复数形式,列名是字段名的蛇形小写。

即,如果有一个user表,那么如果你定义的结构体名为:User,gorm会默认表名为users而不是user。

例如有如下表结构定义:

type User struct {
    Id int 
    Username String
}

4.连接数据库

func ConnectMySQL(host, port, user, pass, dbname string) (*gorm.DB, error) {
    dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
        user, pass, host, port, dbname)
    return gorm.Open(mysql.Open(dsn), &gorm.Config{})
}

首先,mysql.Open 接收一个字符串 dsn,DSN 全称 Data Source Name,翻译过来叫数据库源名称。DSN 定义了一个数据库的连接信息,包含用户名、密码、数据库 IP、数据库端口、数据库字符集、数据库时区等信息。DSN 遵循特定格式:

username:password@protocol(address)/dbname?param=value

通过 DSN 所包含的信息,mysql 驱动就能够知道以什么方式连接到 MySQL 数据库了。

mysql.Open 返回的正是一个 gorm.Dialector 对象,将其传递给 gorm.Open 方法后,我们将得到 *gorm.DB 对象,这个对象可以用来操作数据库。

5.增删改查操作

创建

可以使用 Create 方法创建一条数据库记录:

user := User{Name: "user1"}
`user` (`name`) VALUES ('user1')
result := db.Create(&user) // 通过数据的指针来创建

要创建记录,我们需要先实例化 User 对象,然后将其指针传递给 db.Create 方法。

db.Create 方法执行完成后,依然返回一个 *gorm.DB 对象。

user.ID 会被自动填充为创建数据库记录后返回的真实值。

Create 方法不仅支持创建单条记录,它同样支持批量操作,一次创建多条记录:

查询

查询记录是我们在日常开发中使用最多的场景了,GORM 提供了多种方法来支持 SQL 查询操作。

使用 First 方法可以查询第一条记录:

var user User
result := db.First(&user)

First 方法接收一个模型指针,通过模型的 TableName 方法则可以拿到数据库表名,然后使用 SELECT * 语句从数据库中查询记录。

根据生成的 SQL 可以发现 First 方法查询数据默认根据主键 ID 升序排序,并且只会过滤删除时间为 NULL 的数据,使用 LIMIT 关键字来限制数据条数。

使用 Last 方法可以查询最后一条数据,排序规则为主键 ID 降序:

var lastUser User
result = db.Last(&lastUser)

更新

为了讲解更新操作,我们需要先查询一条记录,之后的更新操作都是基于这条被查询出来的 User 对象:

var user User
// SELECT * FROM `user` WHERE `user`.`deleted_at` IS NULL ORDER BY `user`.`id` LIMIT 1
result := db.First(&user)

更新操作只要修改 User 对象的属性,然后调用 db.Save(&user) 方法即可完成:

user.Name = "John"
user.Age = 20
result = db.Save(&user)

在更新操作时,User 对象要保证 ID 属性存在值,不然就变成了创建操作。

Save 方法会保存所有的字段,即使字段是对应类型的零值。

除了使用 Save 方法更新所有字段,我们还可以使用 Update 方法更新指定字段

删除

可以使用 Delete 方法删除数记录:

var user User
result := db.Where("name = ?", "tom").Delete(&user)

对于删除操作,GORM 默认使用逻辑删除策略,不会对记录进行物理删除。

所以 Delete 方法在对数据进行删除时,实际上执行的是 SQL UPDATE 操作,而非 DELETE 操作。

将 deleted_at 字段更新为当前时间,表示当前数据已删除。这也是为什么前文在讲解查询和更新的时候,生成的 SQL 语句都自动附加了 deleted_at IS NULL Where 条件的原因。

这样就实现了逻辑层面的删除,数据在数据库中仍然存在,但查询和更新的时候会将其过滤掉。