数据库工具GORM的使用 | 青训营笔记

119 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天

1 ORM (Object Relational Mapping)

ORM的作用是在关系型数据库和对象之间作一个映射,可以让我们在操作数据库的时候,不需要再编写复杂的SQL语句。

GORM中结构体对应一个数据表、结构体的字段对应数据表的字段、结构体的一个实例对应数据表中的一条记录。

2 GORM的使用

以MySQL为例,安装gorm框架以及mysql的驱动:

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

2.1 连接数据库

DSN (Data source name) 包含数据库连接的主机地址、端口号、用户名、密码、数据库名等信息,以及一些配置信息,如字符集、时区等。DSN信息的格式如下:

[username[:password]@][protocol[(address)]]/dbname[?param1=value1&...&paramN=valueN]

连接一个MySQL数据库的方法如下:

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

func main() {
    dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
    db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
}

在数据库连接时的优化方向可以(1)关闭默认事务(2)缓存预编译语句

db, err := gorm.Open(mysql.Open(dsn),
    &gorm.Config{
        SkipDefaultTransaction: true,  // 关闭默认事务
        PrepareStmt:            true}, // 缓存预编译语句
)

2.2 增删查改

GORM的增删查改操作在官方文档中有详细的代码Demo,下面就总结一些关键点:

  • 在查询操作中,如果使用First方法,当查询不到时会返回ErrRecordNotFound,而使用Find方法时不会出现报错,因此尽量使用Find方法进行数据查询,通过逻辑代码判断是否查询成功;
  • 使用结构体进行更新操作时只会更新非零值,因此需要更新零值时可以使用Map或者Select选择,一般结构体用于兜底;
  • GORM提供了DeleteAt字段帮助用户实现软删除(即保留删除的记录,在DeleteAt字段进行标记),使用方法如下:
    type User struct {
        gorm.Model // 嵌入gorm.Model
        Name string
    }
    
    type User struct {
        Name     string
        DeleteAt gorm.DeleteAt // 添加DeleteAt字段
    }
    
    

2.3 事务 & Hook

GORM提供了BeginCommitRollback方法用于事务:GORM官方文档 | 事务

Hook 是在创建、查询、更新、删除等操作之前、之后调用的函数:GORM官方文档 | Hook

3 GORM的一些约定

  • GORM 默认设置ID字段为表的主键,可使用gorm:"primary_key"手动设置;
  • GORM 的表名默认为结构体名称的蛇形复数,并且为小写;
  • 结构体字段由两个单词组成时,表对应字段会使用_分割,并且为小写,可以使用gorm:"column:beast_id"修改。