【问题标题】:Golang Gorm: Same query constructed differently throwing different resultsGolang Gorm:相同的查询构造不同,抛出不同的结果
【发布时间】:2022-06-11 13:20:24
【问题描述】:

我想运行以下查询:

SELECT *
FROM artists
WHERE name LIKE '%roll%';

WHERE 子句将是动态的,这意味着我将遍历映射以构建它并将其链接到主查询。

话虽如此,在尝试迭代之前,我考虑过测试方法链接(我是 Gorm 的新手),所以我跑了:

var artist entities.Artist

query := as.db.Model(&artist)

query.Where("name LIKE ?", "%roll%")
if err := query.Find(&as.Artists).Error; err != nil {
    return err
}

如您所见,我正在链接查询的不同部分并使用Find 完成它。这将返回表中的所有元素。打印出执行的查询后,我得到:

SELECT * FROM `artists`  WHERE `artists`.`deleted_at` IS NULL

没有提到LIKE 子句,而且我不知道deleted_at IS NULL 是从哪里来的。虽然目前这并不重要,因为最终我也会将它添加到查询中。

但如果我跑:

var artist entities.Artist

query := as.db.Model(&artist)

if err := query.Where("name LIKE ?", "%roll%").Find(&as.Artists).Error; err != nil {
    return err
}

我得到了我期望的结果。执行的查询是:

SELECT * FROM `artists`  WHERE `artists`.`deleted_at` IS NULL AND ((name LIKE '%roll%')) 

知道发生了什么吗?

【问题讨论】:

    标签: mysql sql go go-gorm


    【解决方案1】:

    文档 (https://gorm.io/docs/query.html) 中使用 query.Where() 的所有示例都显示了链接,就像您的第二个示例一样。

    我的结论是Where()没有修改实例query的SQL,它返回一个包含条件的新查询实例。

    【讨论】:

    • 根据这篇文章stackoverflow.com/questions/41358756/… 的回答,您似乎可以使用WHERE 语句构建查询
    • 但是在那个答案中,他们使用query = query.Where(...),所以他们用 Where() 返回的新查询替换旧的查询值。想想像i = i + 1 这样的代码。这会将变量 i 的值替换为表达式的结果。如果你只是将i + 1 作为一个声明,它不会改变i
    • 是的,你是对的,我的错,我看错了答案
    【解决方案2】:

    我不知道deleted_at IS NULL 来自哪里

    您可能正在使用 gorm.Model 扩展您的模型,其中包括 DeleteAt 字段,这是将 deleted_at IS NULL 添加到查询中的原因。 DeleteAt 用于检查记录是否被删除然后不包含在结果中

    没有提到 LIKE 子句

    var artist entities.Artist
    
    query := as.db.Model(&artist)
    
    query.Where("name LIKE ?", "%roll%") <- will return new query
    if err := query.Find(&as.Artists).Error; err != nil {
        return err
    }
    

    正如比尔指出的 Where 返回带有修改条件的新查询,但是由于您没有为其分配任何内容,因此它不会被添加到查询中

    var artist entities.Artist
    
    query := as.db.Model(&artist)
    
    if err := query.Where("name LIKE ?", "%roll%").Find(&as.Artists).Error; err != nil {
        return err
    }
    

    在这里,您在包含条件的新返回查询上使用 Find,因此它按预期工作。

    要在查询中链接多个 where 条件,您可以通过多种方式实现:

    1:

    var artist entities.Artist
    
    query := as.db.Model(&artist)
    
    query = query.Where("name LIKE ?", "%roll%")
    
    if err := query.Find(&as.Artists).Error; err != nil {
        return err
    }
    

    2:

    var artist entities.Artist
    
    query := as.db.Model(&artist)
    
    err := query.
              Where("name LIKE ?", "%roll%").
              Where("name LIKE ?", "%m%").
              Find(&as.Artists).
              Error
    if err != nil {
        return err
    }
    

    【讨论】:

    • 有什么方法可以实现我在发布的第一个示例中尝试做的事情(尝试在不同的代码行中链接 WHERE 语句)
    • @MrCujo 请检查是否更新了答案
    猜你喜欢
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    相关资源
    最近更新 更多