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