使用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 Version确认问题(版本确认)

    MySQL Version确认问题(版本确认)

    这篇文章主要介绍了MySQL Version确认问题(版本确认),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • 简单谈谈MySQL优化利器-慢查询

    简单谈谈MySQL优化利器-慢查询

    分析MySQL语句查询性能的方法除了使用 EXPLAIN 输出执行计划,还可以让MySQL记录下查询超过指定时间的语句,我们将超过指定时间的SQL语句查询称为“慢查询”
    2017-01-01
  • MySQL启动连接的命令以及与PHP程序连接的基本语法

    MySQL启动连接的命令以及与PHP程序连接的基本语法

    这篇文章主要介绍了MySQL启动连接的命令以及与PHP程序连接的基本语法,简单讲述了PHP中调用MySQL的方法,需要的朋友可以参考下
    2015-11-11
  • 详解MySQL 5.7 MGR单主确定主节点方法

    详解MySQL 5.7 MGR单主确定主节点方法

    这篇文章主要介绍了详解MySQL 5.7 MGR单主确定主节点方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • Windows下MySQL主从复制的配置方法

    Windows下MySQL主从复制的配置方法

    MySQL主从复制允许将来自一个数据库(主数据库)的数据复制到一个或多个数据库(从数据库),主数据库一般是实时的业务数据写入和更新操作,从数据库常用的读取为主
    2020-04-04
  • MySQL主从复制延迟原因以及解决方案

    MySQL主从复制延迟原因以及解决方案

    这篇文章主要介绍了MySQL主从复制延迟原因以及解决方案,帮助大家更好的理解和使用数据库,感兴趣的朋友可以了解下
    2020-09-09
  • MySQL通过show status查看、explain分析优化数据库性能

    MySQL通过show status查看、explain分析优化数据库性能

    这篇文章介绍了MySQL通过show status查看、explain分析优化数据库性能的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • MySQL中实现动态表单中JSON元素精准匹配的方法示例

    MySQL中实现动态表单中JSON元素精准匹配的方法示例

    本文主要介绍了MySQL中实现动态表单中JSON元素精准匹配的方法示例,重点讲解如何在将设计好的动态表单信息进行提取,具有一定的参考价值,感兴趣的可以了解一下
    2024-07-07
  • MySQL中字符串比较大小详解(日期字符串比较问题)

    MySQL中字符串比较大小详解(日期字符串比较问题)

    varchar类型的数据是不能直接比较大小的,下面这篇文章主要给大家介绍了关于MySQL中字符串比较大小的相关资料,详细介绍了日期字符串比较问题,需要的朋友可以参考下
    2022-08-08
  • MySQL实例crash的案例详细分析

    MySQL实例crash的案例详细分析

    这篇文章主要给大家介绍了关于MySQL实例crash的相关资料,文中通过示例代码的非常详细,对大家学习或者使用mysql具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12

最新评论