这是我参与「第三届青训营 -后端场」笔记创作活动的的第5篇笔记。
本节课的老师是gorm的开发者,老师从数据库/sql开始,为我们逐渐引申到gorm的原理及实践,层层递进,受益匪浅。
理解database/sql
Gorm的使用
背景知识
作者用两天左右的时间开发除了gorm,大受震撼。gorm使得在go下调用mysql更加简单快捷,由此可以看出好的工具对于开发效率的提升,“磨刀不误砍柴工”。
基本用法
CRUD
创建数据
result := db.Create(&user) // 创建数据
result.Error // 返回error
result.RowsAffected // 返回影响的行数
读取数据
db.First(&product, 1) // 查询id为1的product
db.First(&product, "code = ?", "L1212") // 查询code为L1212的product
errors.Is(result.Error, gorm.ErrRecordNotFound) // 查询不到数据
更新数据
db.Model(&product).Update("price", 200) // 更新某个字段price为200
db.Model(&product).Updates(Product{Price: 2000, Code:"L1212"}) // 更新多个字段
删除数据
db.Delete(&product)
模型的定义
约定:
- 表名为struct name的snake_cases复数的形式
- 字段名为filed name的snake_case单数的形式
- ID字段为主键,如果为数字,则为自增主键
- CreatedAt字段,创建时,保存当地的时间
- UpdatedAt字段,创建时,更新,保存当前的时间
- gorm.DeletedAt字段,默认开启soft delete模式
Gorm的设计原理
应用程序——>操作接口——>database/sql——>连接/操作接口——>数据库
Gorm插件的注册:
- 注册
- 移动
- 替代 4,获取
在多数据库的场景下,要进行读写分离,负载均衡的策略
Gorm的实践
数据序列化与SQL的表达式
- 通过gorm.Expr
- struct定义GormValuer
- 自定义查询SQL接口
批量数据操作
- 批量创建数据
- 批量查询数据
批量数据怎么进行加速呢?
- 通过关闭默认的事务
- 要会调用hook的方法
- 使用Prepared Statement
安全问题
主要是sql注入的问题,sql注入会导致数据泄露,具有危险性,若要保证安全,则要以参数的形式传入数据
总结
因为是第一次接触ORM框架,所以有许多问题还不是很明白,这节课听的也是云里雾里,不过任重而道远,我觉得以后我会将这些知识弄明白的。