我得到了以下查询,它可以很好地工作:
if err := rs.db.
Preload("Artist").
Preload("Genre").
Where("MATCH(`title`, `label`, `description`, `catalog_number`,`barcode`) AGAINST (? IN BOOLEAN MODE)", text).
Find(&rs.Records).
Error; err != nil {
utils.Logger.Error("error while preloading artists and genres for record", zap.Error(err))
return errors.New(err.Error())
}
正如预期的那样,它的人口为&rs.Records
人.
但是我需要我的查询更灵活,所以我try 向它添加一些通配符,因此原始查询应该如下所示:
SELECT * FROM records WHERE MATCH(`title`, `label`, `description`, `catalog_number`,`barcode`)
AGAINST ('* TEXT YOU WANT TO SEARCH *' IN BOOLEAN MODE)
注意*
的用法.翻译成我的GORM查询的代码应该是这样的:
if err := rs.db.
Preload("Artist").
Preload("Genre").
Where("MATCH(`title`, `label`, `description`, `catalog_number`,`barcode`) AGAINST (*?* IN BOOLEAN MODE)", text).
Find(&rs.Records).
Error; err != nil {
utils.Logger.Error("error while preloading artists and genres for record", zap.Error(err))
return errors.New(err.Error())
}
它会失败,并显示以下错误:
错误1064:您的SQL语法中有一个错误;请查看与您的MySQL服务器版本对应的手册,以了解要在第1行‘? in Boolean mode)’附近使用的正确语法
所以很明显,这是因为我加了*
,所以我试图避开它:
if err := rs.db.
Preload("Artist").
Preload("Genre").
Where("MATCH(`title`, `label`, `description`, `catalog_number`,`barcode`) AGAINST (\\*?\\* IN BOOLEAN MODE)", text).
Find(&rs.Records).
Error; err != nil {
utils.Logger.Error("error while preloading artists and genres for record", zap.Error(err))
return errors.New(err.Error())
}
然而,我也收到了同样的错误.我还试着给它加上转义'
:
if err := rs.db.
Preload("Artist").
Preload("Genre").
Where("MATCH(`title`, `label`, `description`, `catalog_number`,`barcode`) AGAINST (\\'\\*?\\*\\' IN BOOLEAN MODE)", text).
Find(&rs.Records).
Error; err != nil {
utils.Logger.Error("error while preloading artists and genres for record", zap.Error(err))
return errors.New(err.Error())
}
但结果是一样的.
你知道我做错了什么吗?
谢谢.