使用squirrel进行sql拼接不生效问题及解决

 更新时间:2023年09月18日 10:53:57   作者:love666666shen  
这篇文章主要介绍了使用squirrel进行sql拼接不生效问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

使用squirrel拼接sql不生效

拼接sql的时候,一般使用同一个变量不断拼接连接。

但是,在使用github.com/Masterminds/squirrel包进行sql拼接时,

需要多加注意:在使用变量添加sql语句后,还需要重新再赋值给该变量,否则达不到想要的结果。

如下代码:

import 	sq "github.com/Masterminds/squirrel"
func FindProviderProduct(providerID int, keyWord string) (products []*ProductInfo, err error) {
	db, err := GetDB()
	if err != nil {
		return
	}
	buffer := sq.Select("PP.product_id", "P.product_name").From("provider_product as PP").
		LeftJoin("provider as PV on PV.id = PP.provider_id").
		LeftJoin("product as P on P.id = PP.product_id").
		Where(sq.Eq{"P.is_deleted": 0, "PV.is_deleted": 0})
	if providerID != 0 {
		buffer.Where(sq.Eq{"PP.provider_id": providerID})     // 这里拼接完sql后,没有重新赋值给buffer变量,相当于这句sql没有拼接到原buffer语句中
	}
	keyWord = easy.ReplaceSpecialStr(keyWord)
	if len(keyWord) != 0 {
		buffer.Where(sq.Like{"P.product_name": keyWord})   // 这里拼接完sql后,没有重新赋值给buffer变量,相当于这句sql没有拼接到原buffer语句中
	}
	sqlStr, args, _ := buffer.ToSql()
	if err = db.Debug().Raw(sqlStr, args...).Find(&products).Error; err != nil {
		return
	}
	return
}

上面的代码,在进行如下赋值后:

buffer := sq.Select("PP.product_id", "P.product_name").From("provider_product as PP").
		LeftJoin("provider as PV on PV.id = PP.provider_id").
		LeftJoin("product as P on P.id = PP.product_id").
		Where(sq.Eq{"P.is_deleted": 0, "PV.is_deleted": 0})

即使,后面的两个if语句满足条件,但是没有将其中的sql重新赋值给buffer变量,也不会把if里面的筛选条件添加到buffer中,

最终的sql结果仅仅是如下sql:

SELECT PP.product_id, P.product_name
FROM provider_product as PP
LEFT JOIN provider as PV on PV.id = PP.provider_id
LEFT JOIN product as P on P.id = PP.product_id
WHERE P.is_deleted = 0 AND PV.is_deleted = 0;

解决方式

在两个if条件中,处于使用buffer继续添加筛选条件外,还需要将添加后的筛选条件重新赋值给buffer变量即可。

修改后的代码如下:

import 	sq "github.com/Masterminds/squirrel"
func FindProviderProduct(providerID int, keyWord string) (products []*ProductInfo, err error) {
	db, err := GetDB()
	if err != nil {
		return
	}
	buffer := sq.Select("PP.product_id", "P.product_name").From("provider_product as PP").
		LeftJoin("provider as PV on PV.id = PP.provider_id").
		LeftJoin("product as P on P.id = PP.product_id").
		Where(sq.Eq{"P.is_deleted": 0, "PV.is_deleted": 0})
	if providerID != 0 {
		buffer = buffer.Where(sq.Eq{"PP.provider_id": providerID})   // 这里在使用buffer拼接后,需要重新赋值给buffer
	}
	keyWord = easy.ReplaceSpecialStr(keyWord)
	if len(keyWord) != 0 {
		buffer = buffer.Where(sq.Like{"P.product_name": keyWord}) // 这里在使用buffer拼接后,需要重新赋值给buffer
	}
	sqlStr, args, _ := buffer.ToSql()
	if err = db.Debug().Raw(sqlStr, args...).Find(&products).Error; err != nil {
		return
	}
	return
}

使用squirrel中的First

squirrel中的First取1条查询数据,相当于在查询结果中添加limit 1。

例如,现有如下sql拼接:

SELECT IFNULL(MAX(update_time), 0) as max_update_time FROM product WHERE user_id = xxx AND product_status IN (1,2) 

现对如上sql使用First方法,相当于:

SELECT IFNULL(MAX(update_time), 0) as max_update_time FROM product WHERE user_id = xxx AND product_status IN (1,2)  LIMIT 1

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 解决MySQL数据库中文模糊检索问题的方法

    解决MySQL数据库中文模糊检索问题的方法

    解决MySQL数据库中文模糊检索问题的方法...
    2007-11-11
  • MySQL 中MATCH 全文搜索关键字示例详解

    MySQL 中MATCH 全文搜索关键字示例详解

    这篇文章主要介绍了MySQL 中MATCH 全文搜索关键字详解,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-09-09
  • mysqldump进行数据备份详解

    mysqldump进行数据备份详解

    这篇文章主要介绍了mysqldump进行数据备份详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以惨一下
    2022-07-07
  • mysql索引失效的常见九种原因图文详解

    mysql索引失效的常见九种原因图文详解

    索引失效这个问题的前提应该是建立了索引,却没有使用到,或者没有完全使用到,下面这篇文章主要给大家介绍了关于mysql索引失效的常见九种原因的相关资料,需要的朋友可以参考下
    2022-06-06
  • MySQL数据库show processlist指令使用解析

    MySQL数据库show processlist指令使用解析

    这篇文章主要介绍了MySQL数据库show processlist指令使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • MySql8.023安装过程图文详解(首次安装)

    MySql8.023安装过程图文详解(首次安装)

    这篇文章主要介绍了MySql8.023安装过程(首次安装),本文分步骤给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • oracle转mysql语句转换实例代码

    oracle转mysql语句转换实例代码

    最近由于公司业务上需要,需要将原项目的数据库由oracle转换成mysql,下面这篇文章主要给大家介绍了关于oracle转mysql语句转换的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • MySQL 中 datetime 和 timestamp 的区别与选择

    MySQL 中 datetime 和 timestamp 的区别与选择

    MySQL 中常用的两种时间储存类型分别是datetime和 timestamp。如何在它们之间选择是建表时必要的考虑。下面就谈谈他们的区别和怎么选择,需要的朋友可以参考一下
    2021-09-09
  • MySQL本地版本升级超详细教程(从5.5.20升到8.0.21)

    MySQL本地版本升级超详细教程(从5.5.20升到8.0.21)

    MySQL是一款广泛使用的关系型数据库管理系统,但是旧版本的客户端可能会受到一些限制,下面这篇文章主要给大家介绍了关于MySQL本地版本升级超详细教程,本文是从5.5.20升到8.0.21的相关资料,需要的朋友可以参考下
    2023-04-04
  • mysql server 5.7.20 安装配置方法图文教程

    mysql server 5.7.20 安装配置方法图文教程

    这篇文章主要为大家详细介绍了mysql server 5.7.20 安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09

最新评论