使用squirrel進(jìn)行sql拼接不生效問題及解決
使用squirrel拼接sql不生效
拼接sql的時(shí)候,一般使用同一個(gè)變量不斷拼接連接。
但是,在使用github.com/Masterminds/squirrel包進(jìn)行sql拼接時(shí),
需要多加注意:在使用變量添加sql語句后,還需要重新再賦值給該變量,否則達(dá)不到想要的結(jié)果。
如下代碼:
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變量,相當(dāng)于這句sql沒有拼接到原buffer語句中 } keyWord = easy.ReplaceSpecialStr(keyWord) if len(keyWord) != 0 { buffer.Where(sq.Like{"P.product_name": keyWord}) // 這里拼接完sql后,沒有重新賦值給buffer變量,相當(dāng)于這句sql沒有拼接到原buffer語句中 } sqlStr, args, _ := buffer.ToSql() if err = db.Debug().Raw(sqlStr, args...).Find(&products).Error; err != nil { return } return }
上面的代碼,在進(jìn)行如下賦值后:
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})
即使,后面的兩個(gè)if語句滿足條件,但是沒有將其中的sql重新賦值給buffer變量,也不會(huì)把if里面的篩選條件添加到buffer中,
最終的sql結(jié)果僅僅是如下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;
解決方式
在兩個(gè)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條查詢數(shù)據(jù),相當(dāng)于在查詢結(jié)果中添加limit 1。
例如,現(xiàn)有如下sql拼接:
SELECT IFNULL(MAX(update_time), 0) as max_update_time FROM product WHERE user_id = xxx AND product_status IN (1,2)
現(xiàn)對(duì)如上sql使用First方法,相當(dāng)于:
SELECT IFNULL(MAX(update_time), 0) as max_update_time FROM product WHERE user_id = xxx AND product_status IN (1,2) LIMIT 1
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL Version確認(rèn)問題(版本確認(rèn))
這篇文章主要介紹了MySQL Version確認(rèn)問題(版本確認(rèn)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12簡(jiǎn)單談?wù)凪ySQL優(yōu)化利器-慢查詢
分析MySQL語句查詢性能的方法除了使用 EXPLAIN 輸出執(zhí)行計(jì)劃,還可以讓MySQL記錄下查詢超過指定時(shí)間的語句,我們將超過指定時(shí)間的SQL語句查詢稱為“慢查詢”2017-01-01MySQL啟動(dòng)連接的命令以及與PHP程序連接的基本語法
這篇文章主要介紹了MySQL啟動(dòng)連接的命令以及與PHP程序連接的基本語法,簡(jiǎn)單講述了PHP中調(diào)用MySQL的方法,需要的朋友可以參考下2015-11-11詳解MySQL 5.7 MGR單主確定主節(jié)點(diǎn)方法
這篇文章主要介紹了詳解MySQL 5.7 MGR單主確定主節(jié)點(diǎn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09MySQL通過show status查看、explain分析優(yōu)化數(shù)據(jù)庫性能
這篇文章介紹了MySQL通過show status查看、explain分析優(yōu)化數(shù)據(jù)庫性能的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04MySQL中實(shí)現(xiàn)動(dòng)態(tài)表單中JSON元素精準(zhǔn)匹配的方法示例
本文主要介紹了MySQL中實(shí)現(xiàn)動(dòng)態(tài)表單中JSON元素精準(zhǔn)匹配的方法示例,重點(diǎn)講解如何在將設(shè)計(jì)好的動(dòng)態(tài)表單信息進(jìn)行提取,具有一定的參考價(jià)值,感興趣的可以了解一下2024-07-07