Go 框架三件套详解(Web/RPC/ORM) | 青训营笔记

46 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 5天

一、Gorm:

Gorm的约定

  • 使用名为ID的字段作为主键
  • 默认结构体的蛇形复数作为表名,字段名的蛇形作为列名
  • 使用CreatedAt、UpdateAt字段作为创建、更新时间

Gorm支持的数据库

  • MySQL、SQLServer、PostgreSQL、SQLite,通过驱动连接

     import (
         "gorm.io/driver/mysql"
         "gorm.io/gorm"
     )
     ​
     db, err := gorm.Open(
             mysql.Open("root:123456@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"),
             &gorm.Config{})
    

Gorm创建数据

  • 使用default标签为字段定义默认值
  • 使用clause.OnConflict处理数据冲突
 p:=&Product{Code:"D42",ID:1}
 //不处理冲突
 db.Create(p)
 //处理冲突
 db.clauses(clause.OnConflict{DoNothing:true}).Create(&p)

Gorm查询数据

  • First查询单条数据失败返回ErrRecordNotFound,查询多条数据,查询不到不会返回错误
  • 使用结构体作为查询条件,如果字段值为0、''、false或其他零值,不会用于构建查询条件。需要使用Map来构建
 // SELECT * FROM users ORDER BY id LIMIT 1;
 db.First(&user)
 // SELECT * FROM users WHERE name IN ('jinzhu','jinzhu2');
 db.Where("name IN ?",[]string{"jinzhu","jinzhu2"}).Find(&users)
 // SELECT * FROM users WHERE name LIKE '%jin%';
 db.Where("name LIKE ?","%jin%").Find(&users)
 ​
 // SELECT * FROM users WHERE name='jinzhu';
 db.Where(&User{name:"jinzhu",Age:0}).Find(&users)
 // SELECT * FROM users WHERE name='jinzhu'AND age=0;
 db.Where(map[string]interface{}{"name":"jinzhu","Age":0}).Find(&users)

Gorm更新数据

  • 使用结构体作为更新零值同样需要使用Map来构建
  • SQL表达式更新
  • 调用model!!不是db!!
 // UPDATE "products" SET "price"=price*2+100,"updated_at"='2013-11-17-21:34:10' WHERE 'id'=111;
 db.model(&User{ID:111}).Update("age",gorm.Expr("age*?+?",2,100))

Gorm删除数据

  • 通过gorm.DeletedAt用于实现软删除,记录不会从数据库中真正删除,但会将DeletedAt置为当前时间,并且不能再通过正常的查询方法找到该记录
  • 使用Unscoped可以查询软删除的数据

Gorm事务

  • 通过Tansaction方法用于自动提交事务,避免用户漏写Commit、Rollback
 if err=db.Transaction(fun(tx *gorm.DB){
     if err=tx.create(&User{Name:"name"}).Error;err!=nil{
         return err
     }
 });err !=nil{
     return
 }

GormHOOK

  • 是创建、查询、更新、删除等操作之前之后自动调用的函数

二、课后个人总结:

本次课程内容非常的偏向语言底层,需要一定编译原理的基础,有利于更好地理解。如今编译器优化还有很大的发展空间,课后有空多多阅读相关知识点。