使用 GORM的注意事项 | 青训营

201 阅读1分钟

一:使用gorm就能避免SQL注入问题吗?答案是否定的,还要注意使用方式

GORM 使用 database/sql 的参数占位符来构造 SQL 语句,这可以自动转义参数,避免 SQL 注入数据 但是在查询时使用错误的方式就会导致SQL注入问题

userInput := "jinzhu;drop table users;"  
  
// 安全的,会被转义  
db.Where("name = ?", userInput).First(&user)  
  
// SQL 注入  
db.Where(fmt.Sprintf("name = %v", userInput)).First(&user)
// 会被转义 
db.First(&user, "name = ?", userInput)  
// SQL 注入 
db.First(&user, fmt.Sprintf("name = %v", userInput)) 

最重要的一点是不信任用户的输入,如果有一些特殊需求可以添加白名单

二:如何对GORM返回的错误进行处理

GORM 的错误处理与常见的 Go 代码不同,因为 GORM 提供的是链式 API。

如果遇到任何错误,GORM 会设置 *gorm.DB 的 Error 字段,您需要像这样检查它:

if err := db.Where("name = ?", "jinzhu").First(&user).Error; err != nil {
  // 处理错误...
}

或者

if result := db.Where("name = ?", "jinzhu").First(&user); result.Error != nil {
  // 处理错误...
}
ErrRecordNotFound

当 First、Last、Take 方法找不到记录时,GORM 会返回 ErrRecordNotFound 错误。如果发生了多个错误,你可以通过 errors.Is 判断错误是否为 ErrRecordNotFound,例如:

// 检查错误是否为 RecordNotFound
err := db.First(&user, 100).Error
errors.Is(err, gorm.ErrRecordNotFound)

三。模型定义 约定优于配置

image.png

四。First踩坑

使用first时,要注意查询不到会返回ErrRecordNotFound 使用Find 查询多条数据时,查询不到不会犯回错误 当使用结构体查询时,gorm只会查询非0字段

image.png 五。GORM性能提高 可以使用预编译配置 image.png