Golang Gorm:构造不同的相同查询会抛出不同的结果

我想运行以下查询:


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%')) 

知道发生了什么事吗?


海绵宝宝撒
浏览 456回答 2
2回答

九州编程

我不知道deleted_at IS NULL从哪里来您可能正在扩展您的模型,gorm.Model其中包含DeleteAt导致deleted_at IS NULL被添加到查询中的字段。DeleteAt用于检查记录是否被删除,然后不将其包含在结果中没有提到 LIKE 子句var artist entities.Artistquery := as.db.Model(&artist)query.Where("name LIKE ?", "%roll%") <- will return new queryif err := query.Find(&as.Artists).Error; err != nil {&nbsp; &nbsp; return err}正如 Bill 指出的那样Where,返回具有修改条件的新查询,但是由于您没有为其分配任何内容,因此不会将其添加到查询中var artist entities.Artistquery := as.db.Model(&artist)if err := query.Where("name LIKE ?", "%roll%").Find(&as.Artists).Error; err != nil {&nbsp; &nbsp; return err}在这里,您使用Find的是新返回的查询,其中包含条件,因此它按预期工作。要在查询中链接多个 where 条件,您可以通过多种方式实现:1:var artist entities.Artistquery := as.db.Model(&artist)query = query.Where("name LIKE ?", "%roll%")if err := query.Find(&as.Artists).Error; err != nil {&nbsp; &nbsp; return err}2:var artist entities.Artistquery := as.db.Model(&artist)err := query.&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Where("name LIKE ?", "%roll%").&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Where("name LIKE ?", "%m%").&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Find(&as.Artists).&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Errorif err != nil {&nbsp; &nbsp; return err}

慕雪6442864

query.Where()文档(https://gorm.io/docs/query.html&nbsp;)中使用的所有示例都显示了链接,就像您的第二个示例一样。我的结论是Where()不修改实例的 SQL&nbsp;query,它返回一个包含条件的新查询实例。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go