使用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数据库show processlist指令使用解析
这篇文章主要介绍了MySQL数据库show processlist指令使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2019-11-11MySQL 中 datetime 和 timestamp 的区别与选择
MySQL 中常用的两种时间储存类型分别是datetime和 timestamp。如何在它们之间选择是建表时必要的考虑。下面就谈谈他们的区别和怎么选择,需要的朋友可以参考一下2021-09-09MySQL本地版本升级超详细教程(从5.5.20升到8.0.21)
MySQL是一款广泛使用的关系型数据库管理系统,但是旧版本的客户端可能会受到一些限制,下面这篇文章主要给大家介绍了关于MySQL本地版本升级超详细教程,本文是从5.5.20升到8.0.21的相关资料,需要的朋友可以参考下2023-04-04mysql server 5.7.20 安装配置方法图文教程
这篇文章主要为大家详细介绍了mysql server 5.7.20 安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2018-09-09
最新评论