内容概述
本文主要记录了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的进阶内容。