• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
正在输入>
博客园    首页    新随笔    联系   管理    订阅  订阅

GO gorm踩坑记

一. 软删除问题

  1. 问题描述

    gorm调用delete删除数据时,默认底层调用update方法,将delete_at设置为当前时间

    user表中name字段为唯一,这个用户允许删除

    每次Create记录的时候,如果之前已经存在一条已经被软删除的记录,并且被软删除的记录的name与当前新增的记录的name相同

    那么在验证name是否存在的时候,select 就无法查到被软删除的记录,导致验证通过了新增失败的问题

  2. 解决方案:

    两种解决方案: Unscoped()

    2.1. 物理删除: 

db.Unscoped().Where("id = ?", 1).Delete(&User{})

    2.2. 筛选查询:

db.Unscoped().Where("name=?", name).Find(&User{})

 

二. 分页问题

  1. 问题描述:

db.Where().Find(&data).Limit(limit).Offset(offset).Count(&total) // 这段代码会出现奇怪的错误:总条数查不到等等

  2. 解决方案

db.Where().Find(&data).Count(&total).Limit(limit).Offset(offset) // 将Count 放在 分页前

三. 查询问题

  1. 问题描述: 

db.First(&User{})  // 如果没有记录则会返回error: RecordNotFound
db.Find(&User{})  // 如果没有记录则会返回error: RecordNotFound

  2. 解决方案

  两种解决方案:

  2.1. 接受err并判断err是否为 RecordNotFound

  2.2. 传递切片:

var user []User
db.Find(user)

 

posted @ 2021-01-08 14:14  正在输入>  阅读(1105)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3