GORM
这篇笔记用来记录自己对GORM上手使用的过程。接下来将分以下几个部分来记录:
一、连接数据库。
二、模型的定义。
三、CRUD操作。
一、连接数据库
在编写代码使用GORM连接数据库之前,首先确保电脑上已经安装配置好了对应的数据库。
在这里以MySQL为例演示连接数据库。
首先,我们需要导入用到的库,包括"gorm.io/driver/mysql"和"gorm.io/gorm"。
若使用Goland等IDE,IDE会帮助我们自动完成库的下载,若自己手动导入,需要使用go get命令进行下载。
接下来,我们编写init()函数,在函数体中实现数据库的连接。该函数会在所有程序执行开始前被调用,每个包可以包含多个init()函数,所有被编辑器识别到的init函数都会在main函数执行前被调用。通常这个函数被用来注册一个程序需要使用的依赖,如mysql注册,配置文件加载等,正好适合我们对数据库进行连接。
在函数体中,我们先将连接数据库需要的配置进行声明,包括账号,密码,数据库地址,端口号,数据库名,连接超时时间等信息。接下来将这些配置信息通过格式化字符串的方式拼接为对应的dsn(data-source-name)。
然后使用mysql.Open(dsn)完成连接,并传递给gorm.Open()函数,获得DB类型的实例,用于后续数据库的CRUD操作。
此外也应当进行异常处理,若连接失败应该抛出一个panic并打印错误信息。
基于上述过程,示例代码如下:
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
// 定义一个全局变量db
var DB *gorm.DB
//使用init函数,在主函数前进行初始化
func init() {
username := "root" //账号
password := "password" //密码
host := "127.0.0.1" //数据库地址
port := "3306" //端口
Dnname := "myemployees" //数据库名
timeout := "10s" //连接超时,10s
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?timeout=%s", username, password, host, port, Dnname, timeout)
//连接mysql,获得DB类型实例,用于后面数据库的读写操作
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic(any("连接数据库失败,error=" + err.Error()))
}
DB = db
//连接成功
fmt.Println("连接数据库成功")
}
func main() {
}
二、模型的定义
GORM 通过将 Go 结构体(Go structs) 映射到数据库表来简化数据库交互。 了解如何在GORM中定义模型,是充分利用GORM全部功能的基础。
这里尝试GORM官方文档中提供的案例,创建一个user模型。
type User struct {
ID uint // 主键
Name string // 一个常规字符串字段
Email *string // 一个指向字符串的指针,允许空值
Age uint8 // 一个未签名的8位整数
Birthday *time.Time // 一个指向Time的指针,允许空值
MemberNumber sql.NullString // Uses sql.NullString to handle nullable strings
ActivatedAt sql.NullTime // Uses sql.NullTime for nullable time fields
CreatedAt time.Time // 创建时间(由GORM自动管理)
UpdatedAt time.Time // 最后一次更新时间(由GORM自动管理)
}
在此模型中:
- 具体数字类型如
uint、string和uint8直接使用。 - 指向
*string和*time.Time类型的指针表示可空字段。 - 来自
database/sql包的sql.NullString和sql.NullTime用于具有更多控制的可空字段。 CreatedAt和UpdatedAt是特殊字段,当记录被创建或更新时,GORM 会自动向内填充当前时间。
此外,GORM还为模型的字段提供了更多高级选项,包括字段级权限控制,创建/更新时间追踪,字段标签等,这些高级选项在实际使用中也非常实用,详情参考官方文档。
三、CRUD操作
创建表
使用db.AutoMigrate()来创建表,将上述定义的user模型的引用作为参数传入,即可完成表的创建。
func main() {
err := db.AutoMigrate(&User{})
if err != nil {
panic(any("表创建失败:"+err.Error()))
}
fmt.Println("表创建成功")
}
由上图可以看到我们的users表已经成功创建。
创建记录(Create)
使用db.Create()方法,通过数据的指针进行创建,也可以一次创建多条记录,我们在下面的代码中一次创建两条user。
users := []*User{
{Name: "zhangsan", Age: 18, Birthday: time.Now()},
{Name: "lisi", Age: 19, Birthday: time.Now()},
}
result := db.Create(users)
fmt.Println(result.Error) //打印错误
fmt.Println(result.RowsAffected) //打印创建记录的条数
如图所示,已经成功完成了两条记录的插入。
查询记录(Read)
GORM提供了很多种查询方式,这里尝试一些基本的查询。
1.查询一条记录
var user User
result := db.First(&user) //查询第一条记录(主键升序)
//result := db.Take(&user) //查询一条记录,不指定排序
//result := db.Last(&user) //查询最后一条记录(主键降序)
fmt.Println(result.Error)
fmt.Println(result.RowsAffected)
fmt.Println(user)
2.条件查询
主要使用db.Where(条件).Find()方法。下面是一个示例,查询年龄在18岁到24岁之间的用户,并且将用户名和年龄打印输出:
var users []User
results := db.Where("age < ? AND age >= ?", "24", "18").Find(&users)
fmt.Println(results.RowsAffected)
for _,usr := range users{
fmt.Println(usr.Name+" "+strconv.FormatUint(uint64(usr.Age), 10))
}