代码
package main
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
type RequestLink struct {
ID uint `gorm:"primaryKey"`
Link string
IsOpen int `gorm:"column:is_open"`
CreateTime string `gorm:"column:create_time"`
UpdateTime string `gorm:"column:update_time"`
}
func init() {
dsn := "root:root@tcp(127.0.0.1:3306)/test?charset=utf8mb4&parseTime=True&loc=Local"
database, _ := gorm.Open(mysql.Open(dsn), &gorm.Config{})
Gorm = database
}
func (c *RequestLink) TableName() string {
return "request_link"
}
var Gorm *gorm.DB
func main() {
x := RequestLink{}
x.Query1()
x.Query2()
}
func (c *RequestLink) Query1() {
var data2 []RequestLink
Gorm = Gorm.Where("create_time > ?", "2021-11-21 09:00:00")
Gorm.Debug().First(&data2)
}
func (c *RequestLink) Query2() {
var link = "qq"
var is_open = "1"
var data2 []RequestLink
if link != "" {
Gorm = Gorm.Where("link like ?", "%"+link+"%")
}
if is_open != "" {
Gorm = Gorm.Where("is_open = ?", is_open)
}
Gorm.Debug().First(&data2)
}
查询条件,函数1只有时间查询,函数2没有时间查询。
查询结果,很明显看到函数2累加了函数1的查询条件
SELECT * FROM `request_link` WHERE create_time > '2021-11-21 09:00:00' LIMIT 1
SELECT * FROM `request_link` WHERE create_time > '2021-11-21 09:00:00' AND link like '%qq%' AND is_open = '1' LIMIT 1
暂时的解决办法,在每次查询先用变量接收Gorm,这样是可以避免条件累加。
但是这样写不方便、一旦忘记用变量接收就会影响全局SQL
var db = Gorm
db.Find(&data)
之所以拆分写,是在动态条件查询时这样顺手
考虑有更多表要用查询,这里要怎样改才更好 呢
or
总之,别覆盖全局的Gorm。