GORM的使用|青训营

148 阅读3分钟

使用Go开发后端项目的过程中,数据库的连接与增删改查等操作是必不可少的一部分。在其他语言中,都有成熟的MySQL连接库,例如Java的JDBC、MyBatis,Python中的PyMySql。对于Go语言,GORM库提供对MySQL、SQLServer、SQLite等数据库的各种操作的方法。接下来,本文将介绍GORM的使用。

GORM的安装与导入

首先,在控制台中安装GORM:

go get -u gorm.io/gorm

执行上述命令后,gorm会被安装到本地,但这还没有结束。还需要安装对应数据库的驱动,才能实现数据库的连接和后续查询改动等操作。

例如,要连接MySQL数据库,则需安装MySQL的连接驱动器:

go get -u gorm.io/driver/mysql

安装好之后,在代码文件中,使用import导入GORM和相应数据库的连接驱动即可。以连接MySQL为例:

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

连接到数据库(以MySQL为例)

假设我们要建立如下的一个MySQL连接:

用户名:user

密码:password

数据库所在主机地址:127.0.0.1

数据库使用端口: 3306

数据库名称:dbname

可以把这些信息写成如下的字符串:

dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"

注意,这里设置了parseTime参数为True,为了保证Go中的时间数据结构Time.time能被正常处理。此外。设定字符集为utf8mb4,以获得完整的utf8编码支持。

然后建立连接,使用gorm的Open()函数,就会返回一个数据库连接:

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

查询

我们先定义一个和要查询的表相符的结构体,作为model。例如:

type User struct {
    ID   int64
    name string
    age  int64
}

若查询单个记录,可以使用First、Take、Last方法,分别为返回按主键升序查询结果的第一行、未排序的一条记录、主键降序的第一行(即升序排列的最后一条记录)。定义一个模型结构体,将其引用作为参数传入,结果会赋值给该结构体。

db.First(&user)
// SELECT * FROM users ORDER BY id LIMIT 1;

db.Take(&user)
// SELECT * FROM users LIMIT 1;

db.Last(&user)
// SELECT * FROM users ORDER BY id DESC LIMIT 1;

若想要全部查询结果,则使用Find函数。

var users []User
result := db.Find(&users)
// SELECT * FROM users;

使用Where函数,可以实现where子句的条件查询

db.Where("name = ?", "meow").Find(&user)
// SELECT * FROM users WHERE name = 'meow';

如果包含多个条件字段,也可以传入多个值,即AND操作:

db.Where("name = ? AND age >= ?", "meow", "24").Find(&users)
// SELECT * FROM users WHERE name = 'meow' AND age >= 24;

其他MySQL中的查询操作不再一一赘述,有兴趣的话可以查看官方文档。

插入

声明一个的结构体,结构体类型为所插入表的模型,内容为要插入的新纪录。使用Create函数,将结构体引用传参,就可以将该条数据插入数据库,实现insert操作。

user := User{
    Name: "Kasper", 
    Age: 24
}  
result := db.Create(&user)

user结构体在Create函数之后,若先前未指定主键,其主键字段会被赋值为创建成功之后的返回的主键的值。

返回的result中也有多种信息,result.Error包含插入过程中可能出现的错误(无错误即为nil),result.RowsAffected为操作影响的行数。

也可以一次创建多条记录:

users := []*User{     
    User{Name: "Alice", Age: 21},     
    User{Name: "Bob", Age: 22}, 
}  
result := db.Create(users)

或者指定要插入的字段:

db.Select("Name", "CreatedAt").Create(&user)

更新

GORM提供Update函数来实现数据库的更新操作。新建结构体作为参数,指定要更新的字段和值,即可:

db.Model(&user).Updates(User{Name: "hello", Age: 18})

如果已有的user结构体中未指定主键键值,会批量更改所有满足条件的数据。若主键值在先前操作中已确定,则GORM会将主键键值作为条件,仅更新对应的该条记录。

删除

使用Delete函数,与更新的操作类似。未指定主键键值,会批量删除所有满足条件的数据。若主键值已确定,则根据主键删除单条数据。