这是我参与「第五届青训营 」伴学笔记创作活动的第 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
- 是创建、查询、更新、删除等操作之前之后自动调用的函数
二、课后个人总结:
本次课程内容非常的偏向语言底层,需要一定编译原理的基础,有利于更好地理解。如今编译器优化还有很大的发展空间,课后有空多多阅读相关知识点。