数据库和Gorm设计与实践 | 青训营笔记

146 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第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插件的注册:

  1. 注册
  2. 移动
  3. 替代 4,获取

在多数据库的场景下,要进行读写分离,负载均衡的策略

Gorm的实践

数据序列化与SQL的表达式

  • 通过gorm.Expr
  • struct定义GormValuer
  • 自定义查询SQL接口

批量数据操作

  • 批量创建数据
  • 批量查询数据

批量数据怎么进行加速呢?

  • 通过关闭默认的事务
  • 要会调用hook的方法
  • 使用Prepared Statement

安全问题

主要是sql注入的问题,sql注入会导致数据泄露,具有危险性,若要保证安全,则要以参数的形式传入数据

总结

因为是第一次接触ORM框架,所以有许多问题还不是很明白,这节课听的也是云里雾里,不过任重而道远,我觉得以后我会将这些知识弄明白的。