使用squirrel進(jìn)行sql拼接不生效問(wèn)題及解決
使用squirrel拼接sql不生效
拼接sql的時(shí)候,一般使用同一個(gè)變量不斷拼接連接。
但是,在使用github.com/Masterminds/squirrel包進(jìn)行sql拼接時(shí),
需要多加注意:在使用變量添加sql語(yǔ)句后,還需要重新再賦值給該變量,否則達(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后,沒(méi)有重新賦值給buffer變量,相當(dāng)于這句sql沒(méi)有拼接到原buffer語(yǔ)句中
}
keyWord = easy.ReplaceSpecialStr(keyWord)
if len(keyWord) != 0 {
buffer.Where(sq.Like{"P.product_name": keyWord}) // 這里拼接完sql后,沒(méi)有重新賦值給buffer變量,相當(dāng)于這句sql沒(méi)有拼接到原buffer語(yǔ)句中
}
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語(yǔ)句滿足條件,但是沒(méi)有將其中的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)文章
數(shù)據(jù)庫(kù)中的sql完整性約束語(yǔ)句解析
這篇文章主要介紹了數(shù)據(jù)庫(kù)中的sql完整性約束語(yǔ)句解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
phpstudy無(wú)法啟動(dòng)MySQL服務(wù)的完美解決辦法
學(xué)習(xí)php當(dāng)然是要先安裝好運(yùn)行環(huán)境了,phpstyudy是一個(gè)運(yùn)行php的集成環(huán)境,一鍵安裝對(duì)新手很友好,下面這篇文章主要給大家介紹了關(guān)于phpstudy無(wú)法啟動(dòng)MySQL服務(wù)的完美解決辦法,需要的朋友可以參考下2022-06-06
MySQL服務(wù)器 IO 100%的分析與優(yōu)化方案
這篇文章主要給大家介紹了關(guān)于MySQL服務(wù)器 IO 100%的相關(guān)資料,文中通過(guò)示例代碼介紹的介紹非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用mysql具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-10-10
ubuntu下磁盤(pán)空間不足導(dǎo)致mysql無(wú)法啟動(dòng)的解決方法
昨天又遇到了MySQL數(shù)據(jù)庫(kù)無(wú)法重啟的問(wèn)題,還以為是權(quán)限的原因,后來(lái)發(fā)現(xiàn)提示是因?yàn)榇疟P(pán)空間不足導(dǎo)致的,通過(guò)查找相關(guān)資料得以解決了,所以下面這篇文章主要介紹了ubuntu下磁盤(pán)空間不足導(dǎo)致mysql無(wú)法啟動(dòng)的解決方法,需要的朋友可以參考下。2017-03-03
mysql8.0無(wú)法使用group by的問(wèn)題及解決
這篇文章主要介紹了mysql8.0無(wú)法使用group by的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10
MySQL 按指定字段自定義列表排序的實(shí)現(xiàn)
下面小編就為大家?guī)?lái)一篇MySQL 按指定字段自定義列表排序的實(shí)現(xiàn)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03

