GO后端开发|青训营笔记

41 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第5天,在过去几天,我学习了go语言框架三件套,即Gorm,Kitex以及Hertz

Gorm的基础使用

Gorm的模型定义

  • GORM 倾向于约定,而不是配置。
  • GORM 使用 ID 作为主键
  • 使用结构体名的 蛇形复数 作为表名,字段名的 蛇形 作为列名
  • 使用 CreatedAtUpdatedAt 字段追踪创建、更新时间
  • GORM 定义一个 gorm.Model 结构体,其包括字段 IDCreatedAtUpdatedAtDeletedAt
type Model struct {  
    ID uint `gorm:"primaryKey"`  
    CreatedAt time.Time  
    UpdatedAt time.Time  
    DeletedAt gorm.DeletedAt `gorm:"index"`  
}

Gorm连接数据库

  • GORM 官方支持的数据库类型有: MySQL, PostgreSQL, SQlite, SQL Server
import (
  "gorm.io/driver/mysql"
  "gorm.io/gorm"
)

func main() {
  // 参考 https://github.com/go-sql-driver/mysql#dsn-data-source-name 获取详情
  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{})
}

Gorm创建数据

  • 创建记录
user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}  
result := db.Create(&user) // 通过数据的指针来创建  
user.ID             // 返回插入数据的主键 
result.Error        // 返回 error result.RowsAffected // 返回插入记录的条数 
  • 用选定字段的来创建
db.Select("Name", "Age", "CreatedAt").Create(&user) 
// INSERT INTO `users` (`name`,`age`,`created_at`) VALUES ("jinzhu", 18, "2020-07-04 11:05:21.775") 
  • 创建时排除选定字段
db.Omit("Name", "Age", "CreatedAt").Create(&user) 
// INSERT INTO `users` (`birthday`,`updated_at`) VALUES ("2020-01-01 00:00:00.000", "2020-07-04 11:05:21.775") 
  • 创建钩子

GORM 允许 BeforeSaveBeforeCreateAfterSaveAfterCreate 等钩子,创建记录时会调用这些方法, 详情请参阅 钩子

func (u *User) BeforeCreate(tx *gorm.DB) (err error) {   u.UUID = uuid.New()      if u.Role == "admin" {         return errors.New("invalid role")     }     return } 
  • 批量插入

将切片数据传递给 Create 方法,GORM 将生成一个单一的 SQL 语句来插入所有数据,并回填主键的值,钩子方法也会被调用。

var users = []User{{Name: "jinzhu1"}, {Name: "jinzhu2"}, {Name: "jinzhu3"}} DB.Create(&users)  for _, user := range users {   user.ID // 1,2,3 } 

引用

gorm.cn/zh_CN/docs/…