Glang gorm库执行SQL查询,不同函数之间查询条件会累加是什么原因?

代码

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)

之所以拆分写,是在动态条件查询时这样顺手
考虑有更多表要用查询,这里要怎样改才更好 呢

阅读 4.6k
2 个回答
Gorm.Where(..).Where(..).Debug().First(&data2)

or

m1 := Gorm.Where(..)
m1 := Gorm.Where(..)
m1.Debug().First(&data2)

总之,别覆盖全局的Gorm。

原因是你的程序中出现多次类似下列的语句成分

Gorm = Gorm.Where

不止一次重新赋值了全局变量Gorm,导致该全局变量会使用上一次的where数据。
按下面的写法写就好了,全局变量初始化好了就不要修改了。

func (c *RequestLink) Query3() {
    var link = "qq"
    var is_open = "1"
    var data []RequestLink
    Gorm.Debug().Where("is_open = ? and link like ?", is_open, "%"+link+"%").First(&data)
    fmt.Printf("%+v\n", data)
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题