第六届字节跳动青训营——GORM学习之路第一节 | 青训营

79 阅读3分钟

内容概述

本文主要记录了GORM的学习之路,以mysql为例。GORM是Go语言的ORM,可以省去写sql语句。可以理解为sql和Go的一层封装,使用Go直接操作数据库,很方便,但是对于一些比较细节的sql语句不建议使用。GORM的官网文档地址为gorm.cn/zh_CN/docs

主要内容

连接

首先下载mysql的驱动,在shell窗口输入

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

一个简单的连接示例如下。useename表示账号,password表示密码,host表示数据库地址,port表示数据库端口,Dbname表示数据库名,timeout用于设定连接超时。

username := "account"  
password := "123456"  
host := "127.0.0.1" 
port := 3306       
Dbname := "gorm"   
timeout := "5s"    
// root:root@tcp(127.0.0.1:3306)/gorm?
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local&timeout=%s", username, password, host, port, Dbname, timeout)
//连接MYSQL, 获得DB类型实例,用于后面的数据库读写操作。
db, err := gorm.Open(mysql.Open(dsn))
if err != nil {
  panic("连接数据库失败, error=" + err.Error())
}
// 连接成功
fmt.Println(db)

GORM 会在事务里执行写入操作(创建、更新、删除)来确保数据一致性。可以在初始化时禁用它,这样可以获得性能提升,执行更加快。

db, err := gorm.Open(mysql.Open("gorm.db"), &gorm.Config{
  SkipDefaultTransaction: true,
})

gorm的命名策略是,表名是蛇形复数,字段名是蛇形单数 对于如下的结构体

type Student struct {
  Name      string
  Age       int
}

实际会执行sql语句

CREATE TABLE `students` (`name` longtext,`age` bigint)

当然这是可以修改的,在初始化时NamingStrategy设置。

定义模型

模型是标准的 struct,由 Go 的基本数据类型、实现了Scanner和Valuer接口的自定义类型及其指针或别名组成。注意字段名要首字母大写,字段属性可以在字段属性后面添加,用;隔开。具体如下:

type Student1 struct {
  Email  *string `gorm:"size:32"` 
  Addr   string  `gorm:"column:y_addr;size:16"`
  Gender bool    `gorm:"default:true"`
}
type Student2 struct {
  Name string      `gorm:"type:varchar(12);not null;comment:用户名"`
  UUID string      `gorm:"primaryKey;unique;comment:主键"`
  Info Student1 `gorm:"embedded;embeddedPrefix:s_"`
}

使用指针可以存空值;size用来定义字段大小;column用来自定义列名;default用来定义列的默认值;not null表示不可为空;comment表示注释;primaryKey表示将列定义为主键;embedded表示嵌套字段;embeddedPrefix表示嵌套字段前缀。

增删改查

以单表为例,表结构如下:

type Student struct {
  ID     uint   `gorm:"size:3"`
  Name   string `gorm:"size:8"`
  Age    int    `gorm:"size:3"`
  Gender bool
  Email  *string `gorm:"size:32"`
}

添加记录。指针类型传值时要传指针,Create接收的是一个指针。

email := "xxx@qq.com"
// 创建记录
student := Student{
  Name:   "zhouzhou",
  Age:    21,
  Gender: true,
  Email:  &email,
}
DB.Create(&student)

查询单条记录,Take第二个参数可以是字符串或数字,默认用来根据主键查询。也可根据其它条件查询,使用?作为占位符进行匹配查询。

var student Student
DB.Take(&student,2)
DB.Take(&student,"name = ?", "zhouzhou")

获取查询的记录数和是否查询失败。

count := DB.Find(&studentList).RowsAffected
err := DB.Find(&studentList).Error

更新 Save用于单个记录的全字段更新,即使零值也会保存。

var student Student
DB.Take(&student)
student.Age = 24
DB.Save(&student)

select用来选择要更新的字段

var student Student
DB.Take(&student)
student.Age = 24
DB.Select("age").Save(&student)

update用来条件更新,如24岁的学生都更新一下邮箱。

var studentList []Student
DB.Find(&studentList, "age = ?", 24).Update("email", "is24@163.com")

delete用来删除

db.Delete(&student)

总结

本文主要记录了有关GORM的连接,定义模型,和一些简单的增删改查内容,下一节打算记录一下有关GORM的进阶内容。