GORM上手(基础) | 青训营笔记

240 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第4篇笔记

GORM中文文档

go语言可以使用gorm操作数据库

安装

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

模型定义

模型定义

模型是标准的 struct,由 Go 的基本数据类型、实现了 ScannerValuer 接口的自定义类型及其指针或别名组成

type User struct {
   Id     int
   Name   string
   Sal    int
   Job    string
   Deptno string
}

gorm.Model

GORM 定义一个 gorm.Model 结构体,其包括字段 IDCreatedAtUpdatedAtDeletedAt

// gorm.Model 的定义
type Model struct {
  ID        uint           `gorm:"primaryKey"`
  CreatedAt time.Time
  UpdatedAt time.Time
  DeletedAt gorm.DeletedAt `gorm:"index"`
}

您可以将它嵌入到您的结构体中,以包含这几个字段,详情请参考 嵌入结构体

注意:

如果你在结构体中加入了gorm.Model;

gorm将会默认进行软删除,你需要保证你的数据库可以与其适应

高级选项

你可以设置:

  • 字段级权限控制
  • 创建/更新时间追踪(纳秒、毫秒、秒、Time)
  • 嵌入结构体
  • 字段标签

上述选型可去官方文档查看👉

连接数据库

此处以MySQL为准,其他数据库(GORM官方支持MySQL, PostgreSQL, SQlite, SQL Server)快去官方文档查看

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{})

其中:

  • user : 用户名
  • pass : 对应的密码
  • (127.0.0.1:3306) : ip地址和端口号
  • dbname : 数据库名称
  • 加入parseTime以处理time.Time
  • charset=utf8以支持完整的UTF-8编码
  • 更多参数请看->github.com/go-sql-driv…

GORM 也可以通过一个现有的数据库连接来初始化

import (  
    "database/sql"  
    "gorm.io/driver/mysql" 
    "gorm.io/gorm"
    _ "example.com/my_mysql_driver"
)
sqlDB, err := sql.Open("mysql", "mydb_dsn")
gormDB, err := gorm.Open(mysql.New(mysql.Config{ DriverName: "my_mysql_driver", Conn: sqlDB,}), &gorm.Config{})

GORM 允许通过 DriverName 选项自定义 MySQL 驱动

如上👆

CRUD

创建

newUser := User{
   Id:   1,
   Name: "小红",
   Sal:  3000,
   Job:  "刷碗",
}

result := db.Table("my_table02").Create(&newUser)
if result.Error != nil {
        panic(result.Error)
}
fmt.Println(result.RowsAffected, "rows have changed")
  • result.Error:error
  • result.RowsAffected 插入记录的条数

用指定的字段进行创建

db.Select("Id", "Name", "Sal","Job").Create(&newUser)

同时类似的可以通过指定忽略字段进行创建

db.Omit("Job").Create(&newUser)

批量创建

要有效地插入大量记录,请将一个 slice 传递给 Create 方法。 GORM 将生成单独一条SQL语句来插入所有数据,并回填主键的值

var users = []User{{Name: "User1"}, {Name: "User2"}, {Name: "User3"}}
db.Create(&users)
​
for _, user := range users {
  user.ID // 1,2,3
}

查询

查多个

Find

var users []User
//result := db.Table("my_table02").Where("id=?", 100).Find(&users)
result := db.Table("my_table02").Find(&users)
if result.Error != nil {
   panic(result.Error)
}
fmt.Println(result.RowsAffected, "rows have found")
for _, user := range users {
   fmt.Println(user.toString())
}

其中:

db.Table("my_table02") 为指定表名

当然可以使用db.AutoMigrate(&User{})进行绑定

查一个

GORM 提供了 FirstTakeLast 方法,以便从数据库中检索单个对象。当查询数据库时它添加了 LIMIT 1 条件,且没有找到记录时,它会返回 ErrRecordNotFound 错误

  • First : 第一个
  • Take : 任一个
  • Last : 最后一个

更新

更新单列

update

更新指定的字段名

db.Table("my_table02").Where("id = ?", 1).Update("Name", "小明")

更新多列

db.Table("my_table02").Where("id = ?", 1).Updates(User{Name: "hello", Age: 18, Active: false})

更新全列

db.Table("my_table02").Where("Sal = ?", nil).Model(&newUser)

删除

删除一条记录时,删除对象需要指定主键,否则会触发批量删除

主键删除

db.Table("my_table02").Delete(newUser)

批量删除

如果指定的值不包括主属性,那么 GORM 会执行批量删除,它将删除所有匹配的记录

db.Table("my_table02").Where("name = ?", "小鸣").Delete(User{})