使用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繼續(xù)添加篩選條件外,還需要將添加后的篩選條件重新賦值給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 status查看、explain分析優(yōu)化數據庫性能
這篇文章介紹了MySQL通過show status查看、explain分析優(yōu)化數據庫性能的方法,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-04-04MySQL中實現動態(tài)表單中JSON元素精準匹配的方法示例
本文主要介紹了MySQL中實現動態(tài)表單中JSON元素精準匹配的方法示例,重點講解如何在將設計好的動態(tài)表單信息進行提取,具有一定的參考價值,感興趣的可以了解一下2024-07-07