GORM多列模糊查询时如何避免与删除标记冲突?

gorm多列模糊查询时如何避免与删除标记冲突?

GORM多列模糊查询:巧妙规避删除标记冲突

在使用GORM进行数据库操作时,多列模糊查询常常与删除标记冲突。本文将分析一个使用GORM or方法进行多列模糊查询,却意外查询到已删除记录的问题,并提供有效的解决方案。

问题描述: 开发者希望根据用户输入的关键词,模糊匹配user表中的usernamenickname字段,同时排除已删除记录(is_del字段为1)。然而,使用where("username like ?", "%"+keyword+"%").or("nickname like ?", "%"+keyword+"%")的方式,导致即使is_del为1的记录也被查询出来。

问题代码:

func getusers(param *models.listuserreq) ([]*models.user, int, error) {    var users []*models.user    var count int    _db := db    keyword := param.keyword    if keyword != "" {        _db = _db.where("username like ?", "%"+keyword+"%").or("nickname like ?", "%"+keyword+"%")    }    if param.type > 0 {        _db = _db.where("type = ?", param.type)    }    _db = _db.where("is_del = ?", param.isdel)    order := fmt.sprintf("%s %s", param.ordername, param.ordertype)    err := _db.order(order).offset(param.pagenum * param.pagesize).limit(param.pagesize).find(&users).error    if err != nil && err != gorm.errrecordnotfound {        return nil, 0, err    }    if err := _db.model(&models.user{}).count(&count).error; err != nil {        return nil, 0, err    }    return users, count, nil}

问题根源: GORM的or方法导致生成的SQL语句为where username like '%keyword%' or nickname like '%keyword%'。如果is_del = 1的记录满足其中任一条件,就会被查询出来,从而忽略了后续的where("is_del = ?", param.isdel)条件。

解决方案: 为了解决这个问题,需要将模糊查询条件和删除标记条件合并到同一个where语句中:

_db = _db.Where("username LIKE ? OR nickname LIKE ? AND is_del = ?", "%"+keyword+"%", "%"+keyword+"%", param.isdel)

或者更清晰地使用括号:

_db = _db.Where("(username LIKE ? OR nickname LIKE ?) AND is_del = ?", "%"+keyword+"%", "%"+keyword+"%", param.isdel)

这样生成的SQL语句会同时考虑模糊匹配和is_del条件,确保只有同时满足这两个条件的记录才会被查询到,有效避免了冲突。 修改后的代码确保了数据准确性。

以上就是GORM多列模糊查询时如何避免与删除标记冲突?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1385566.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月15日 05:30:56
下一篇 2025年12月15日 05:31:06

相关推荐

  • Go语言数据库操作:如何避免正则表达式中的问号被误认为参数占位符?

    Go语言Vertica数据库操作:正则表达式问号的正确处理 在使用Go语言操作Vertica数据库时,SQL语句中的正则表达式如果包含问号“?”,可能会被数据库驱动程序误认为是参数占位符,导致执行错误。本文将详细讲解如何解决这个问题。 问题: 开发者使用db.Query(sql)执行包含正则表达式的…

    2025年12月15日
    000
  • Go语言Gorm框架下,如何精准控制MySQL特定表的Binlog记录?

    在Go语言中,使用Gorm框架操作MySQL数据库时,如何精确控制特定表的Binlog日志写入?本文将深入探讨这一问题,并提供可靠的解决方案。 问题:即使在操作表A前设置会话变量sql_log_bin=0,随后恢复为sql_log_bin=1,表A的操作仍然记录在Binlog中。这是因为会话变量仅作…

    2025年12月15日
    000
  • Go Gorm框架下如何精确控制MySQL特定表的Binlog日志?

    使用Go语言的Gorm框架操作MySQL数据库时,如何精确控制特定表的Binlog日志记录?本文将解决一个常见问题:开发者希望在操作特定表(例如表A)时,临时禁用该表的Binlog日志记录,但使用db.Exec(fmt.Sprintf(“set sql_log_bin=%d”, 0))设置会话变量后…

    2025年12月15日
    000
  • Go语言连接Vertica数据库:如何正确使用正则表达式避免问号冲突?

    Golang连接Vertica数据库:正则表达式问号冲突的解决之道 本文探讨使用Golang database/sql 包操作Vertica数据库时,如何避免正则表达式中的问号 ? 被误认为是SQL参数占位符的问题。 问题: 当使用 db.Query(sql) 执行包含正则表达式的SQL语句时,可能…

    2025年12月15日
    000
  • GORM模型查询:如何精确控制返回字段并避免AfterFind钩子失效?

    GORM模型查询与字段精细控制:解决AfterFind钩子失效难题 在GORM数据库查询中,精确控制返回字段至关重要。本文将深入探讨如何利用GORM模型仅返回指定列,并解决JSON字段处理中AfterFind钩子失效的问题。 问题描述: 在使用GORM查询post模型时,假设只希望获取id和imag…

    2025年12月15日
    000
  • Go GORM中如何精确控制MySQL特定表的Binlog日志记录?

    使用Go语言的GORM框架操作MySQL数据库时,如何精确控制特定表的Binlog日志记录?许多开发者在启用MySQL Binlog日志功能后,希望能够选择性地排除某些表的操作记录。本文将讲解如何在GORM中实现这一目标。 许多开发者尝试使用db.Exec(fmt.Sprintf(“SET sql_…

    2025年12月15日
    000
  • Go Gorm多表关联查询:如何高效获取用户信息?

    高效使用gorm框架进行golang多表关联查询:获取用户信息 本文介绍如何利用Gorm框架在Record、RecordUser和User三个关联表中高效获取用户信息。 场景:Record表一对多关联RecordUser表,RecordUser表一对一关联User表。目标:查询Record的同时,直…

    2025年12月15日
    000
  • Go语言GORM框架:如何高效查询关联表中的用户名?

    Go语言GORM框架多表关联查询:高效获取用户名 使用Go语言GORM框架进行数据库操作时,多表关联查询是常见需求。本文演示如何优雅地实现三表关联查询,获取user.username字段值。 假设存在三个结构体:Record、RecordUser和User,它们之间存在一对多和一对一关系:Recor…

    2025年12月15日
    000
  • Golang Gorm框架:如何高效实现三表关联查询并获取User.UserName?

    Golang Gorm框架中的高效三表关联查询 本文将详细讲解如何利用Gorm框架高效地完成三表关联查询,并获取目标数据User.UserName。 我们将解决一个常见问题:如何在一个查询中同时获取Record、RecordUser和User表的数据,最终提取User.UserName。 问题背景:…

    2025年12月15日
    000
  • GORM关联查询:如何精确控制查询字段以避免信息泄露?

    GORM关联查询:如何有效避免敏感数据泄露? 在使用GORM进行关联查询时,精确控制查询字段至关重要,这能有效防止敏感信息的泄露。 以下以文章表和用户表为例,演示如何仅查询用户昵称、头像和ID,而排除密码等敏感字段: 一对一关联模型的字段选择 GORM 提供了 select() 方法来精确指定需要查…

    2025年12月15日
    000
  • PHP支付回调中如何保证数据一致性?

    PHP支付回调:确保数据一致性的策略 支付回调处理中,需要更新订单状态、调整库存、扣减优惠券和积分等多个步骤。为了确保数据完整性,避免因部分操作失败导致数据不一致,最佳实践是使用数据库事务。 实现步骤: 事务开启: 使用数据库连接启动一个事务,将后续所有操作绑定到该事务中。操作执行: 执行更新订单状…

    2025年12月15日
    000
  • Xorm中如何正确隐藏字段并读取其值?

    巧妙解决Xorm框架中字段隐藏与读取的难题 在使用Xorm进行数据库操作时,出于安全考虑,我们常常需要隐藏某些敏感字段。本文将深入探讨如何在Xorm框架下有效隐藏字段,同时确保在数据插入时能够正确读取这些隐藏字段的值。 问题:隐藏字段值丢失 通常情况下,我们使用json:”-“来隐藏字段。然而,这种…

    2025年12月15日
    000
  • 全局数据库连接变量会影响性能吗?

    全局数据库连接变量:性能考量 项目中使用全局数据库连接变量是否会影响性能?答案取决于多种因素。让我们深入探讨: Java与Go数据库连接池的对比 Java使用数据源管理数据库连接池,可配置最大空闲连接数(maxIdle)和最大活跃连接数(maxActive)。Go的连接池设置类似。Java项目通常共…

    2025年12月15日
    000
  • 全局数据库连接变量:高并发下会带来哪些性能问题?

    全局数据库连接:高并发下的性能挑战 在某些编程语言的项目中,直接使用全局变量存储数据库连接是一种常见的做法,但这在高并发环境下可能会带来严重的性能问题。本文分析了这种方法的潜在风险。 Java连接池机制的优势 Java应用通常利用连接池有效管理数据库连接。连接池预先创建并维护一定数量的数据库连接,供…

    2025年12月15日
    000
  • 如何高效查询特定时间段内数据的最高价和最低价?

    如何构建一个高效的时间条件查询器?本文将探讨如何快速精确地查询特定时间范围内某字段的最高价和最低价,尤其是在数据写入和查询同时进行,可能导致高CPU负载和内存不足的情况下。 为了实现高性能查询,我们提出以下两种方案: 方案一:优化数据库查询 SQL 查询优化: 利用SQL语句优化查询效率。例如,缓存…

    2025年12月15日
    000
  • PHP支付回调:如何用数据库事务保证数据一致性?

    PHP支付回调中,如何利用数据库事务保证数据完整性? 处理PHP支付回调时,需要保证多个操作的原子性,例如:更新订单状态、调整库存、取消优惠券和积分等。数据库事务是确保这些操作一致性的最佳方案。 数据库事务是一组逻辑上相关的操作单元,它们要么全部成功执行,要么全部回滚,保证数据的一致性和完整性。 在…

    2025年12月15日
    000
  • Redshift数据库中从DataFrame高效批量插入数据的策略与实践

    本教程旨在解决从python dataframe向amazon redshift数据库高效批量插入数据的挑战。文章将深入探讨传统逐行或小批量插入方法的性能瓶颈,并提出两种优化策略:利用`psycopg2.extras.execute_values`实现多行sql插入,以及更推荐的、通过amazon …

    2025年12月15日
    000
  • 在Pypika中添加常量列:使用ValueWrapper实现

    本文将深入探讨在pypika中构建sql查询时,如何正确地添加常量列。针对pseudocolumn无法实现字符串字面量作为常量列的问题,我们将详细介绍并演示pypika.terms.valuewrapper的使用方法,确保生成的sql语句能够准确地包含带别名的常量值,从而解决在查询中引入固定字面量值…

    2025年12月15日
    000
  • Pypika查询中添加常量列的实用指南

    本教程旨在解决pypika中如何向sql查询添加字面常量列的问题。许多用户在尝试使用`pseudocolumn`时遇到困难,因为它无法正确生成带引号的字符串字面量。我们将详细介绍`pypika.terms.valuewrapper`的正确用法,通过具体的代码示例,展示如何将字符串或其他字面值作为常量…

    2025年12月15日
    000
  • Redshift大数据量DataFrame高速插入策略

    本文旨在解决从Python DataFrame向Amazon Redshift数据库插入大量数据时效率低下的问题。我们将探讨并对比两种主要的高速插入策略:优化的SQL批量插入(通过psycopg2.extras.execute_values)和Redshift官方推荐的COPY命令(结合S3作为中间…

    2025年12月15日
    000

发表回复

登录后才能评论
关注微信