这是我参与[第五届青训营]伴学笔记创作活动的第5天。
简介
本篇笔记主要是记录 gorm 的介绍和基本使用方法。在本篇文章中只展示 mysql 的用法。
什么是gorm
orm Object-Relation Mapping,即对象关系映射。主要在于能够在关系型数据库和对象之间作一个映射,使得我们不必再去使用复杂的 SQL 语句,只要使用对象就能完成对数据库中的数据操作。
gorm 使用 golang 所写的一个 orm 库。
安装
使用 go get 来获取 gorm
go get github.com/jinzhu/gorm
引入 gorm
这里使用 gorm 文档中的例子来展示如何引入 gorm。 先设置数据库的基础信息,然后就可以使用 gorm.Open 来引入 gorm。
package main
import (
"gorm.io/gorm"
"gorm.io/driver/mysql"
)
type Product struct {
gorm.Model
Code string
Price uint
}
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{})
if err != nil {
panic("failed to connect database")
}
}
上面代码中的 gorm.Model 为 gorm 中的内置结构体, 其包括字段 ID, CreatedAt,UpdatedAt, DeletedAt。其结构如下所示:
type Model struct {
ID uint `gorm:"primaryKey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt gorm.DeletedAt `gorm:"index"`
}
gorm 倾向于约定,而不是配置。默认情况下,gorm 使用 ID 作为主键,使用结构体名的蛇形复数作为表名,字段名的 蛇形 作为列名,并使用 CreatedAt、UpdatedAt 字段追踪创建、更新时间
创建记录
创建记录为数据库操作的增加数据。通过 gorm 我们能很好的完成对数据库的操作。
在 gorm中, 我们通过 Create 函数来创建一个新的记录,注意要通过数据的指针来创建,该函数返回user.Id、 result.Error、 result.RowsAffected,分别代表插入数据的主键,error,插入记录的条数。
user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}
result := db.Create(&user)
我们也可以使用选定个别字段来创建一个记录
db.Select("Name", "Age", "CreatedAt").Create(&user)
也可以使用 map 来创建记录。
DB.Model(&User{}).Create(map[string]interface{}{
"Name": "jinzhu", "Age": 18,
})
查询记录
查询记录即为数据库操作中的查找数据。
使用 Where 语句以及 Find 函数查询,Find 函数会返回查询的所有满足查询条件的数据。其基本方式为:
db.Where("name = ?", "jinzhu").Find(&users)
同时 gorm 还提供 Not、Or、Select、Limit、Offset、First、Last、Group、 Having、Distinct、Joins 等函数来完成 mysql 查询。
当未找到数据时,会返回ErrRecordNotFound错误。
更新记录
更新记录即为数据库操作中的数据更新。 使用 Update 更新数据,其基本使用方式如下所示:
db.Model(&User{}).Where("active = ?", true).Update("name", "hello")
db.Model(&user).Where("active = ?", true).Update("name", "hello")
第二种方式在更新时会自动带上 user 对象的主键。
删除记录
删除记录即为数据库操作中的数据删除。 使用 Delete 删除数据,其基本用法如下所示:
db.Delete(&User{}, 10)
db.Where("name = ?", "jinzhu").Delete(&email{})
如果您的模型包含了一个 gorm.deletedat 字段(gorm.Model 已经包含了该字段),它将自动获得软删除的能力。
拥有软删除能力的模型调用 Delete 时,记录不会被从数据库中真正删除。但 GORM 会将 DeletedAt 置为当前时间, 并且你不能再通过正常的查询方法找到该记录。
查找被软删除的记录:
db.Unscoped().Where("age = 20").Find(&users)
永久删除:
db.Unscoped().Delete(&order) // DELETE FROM orders WHERE id=10;