这是我参与「第三届青训营 -后端场」笔记创作活动的第2篇笔记
1. 理解database/mysql
1.1 基本用法 - Quick start
- import driver实现
使用driver + DSN初始化DB连接
func main(){ db,err := sql.Open("mysql","user:password@tcp(127.0.0.1:3306)/hello") - 执行一条SQL,通过rows取回返回的数据,处理完毕,需要释放链接
rows,err := db.Query("select id,name from users where id = ?",1) if err != nil{ // xxx } defer rows.Close() - 数据、错误处理
错误处理var users []User for rows.Next(){ var user User err := rows.Scan(&user.ID,&user.Name) if err != nil{ // ... } users = append(users,user) }if rows.Err() != nil{ // ... }
1.2 设计原理
2. GORM基础使用
2.1 基本用法
功能完善:
- 关联:一对一、一对多、单表自关联、多态;Preload、Joins 预加载、级联删除;关联模式;自定义关联表
- 事务:事务代码块、嵌套事务、Save Point
- 多数据库、读写分离、命名参数、Map、子查询、分组条件、代码共享、SQL表达式(查询、创建、更新)、自动选字段、查询优化器
- 字段权限、软删除、批量数据处理、Prepared Stmt、自定义类型、命名策略、虚拟字段、自动 track 时间、SQL Builder、Logger
- 代码生成、复合主键、Constraint、Prometheus、Auto Migration、真·跨数据库兼容...
- 多模式灵活自由扩展
- Developer Friendly
CRUD
//读取
var product Product
db.First(&product,1) //查询id为1的product
db.FirstC&product,"code=?","L1212")// 查询code为L1212的product
result := db.Find(&users, Dint{1,2 3}) result.RowsAffected//返回找到的记录数
errors.Is(result.Error,gorm.ErrRecordNotFound)// First,Last,Take 查不到数据
// 更新某个字段
db.Model(&product).Update("Price",2000)
字节跳云
db.Model(&product).UpdateColumn("Price",2000)
//更新多个字段
db.Model(&product).Updates(Product{Price: 2000,Code:"L1212"})
db.Model(&product).Updates(map[string]interface{}{"Price": 2000,"Code":"L1212"})
//批量更新
db.Model(&Product{}).where("price <?",2000). Updates(map[string] interface{"Price": 2000}
//删除-删除product db.Delete &product)
模型定义 - 惯例约定
- 表名为 struct name 的 snake cases 复数格式字段名为 field name 的 snake case 单数格式ID/ld 字段为主键,如果为数字,则为自增主键* CreatedAt 字段,创建时,保存当前时间
- UpdatedAt 字段,创建、更新时,保存当前时间*gorm.DeletedAt 字段,默认开启 soft delete 模式