猿问

Not() 属于错误的表

我正在使用 go 版本 go1.10.3 linux/amd64 和 mysql 5.7。


需要使用 GORM 的 docker compose config 运行,或者请提供您的配置。


package main


import (

    "github.com/jinzhu/gorm"

    _ "github.com/jinzhu/gorm/dialects/mssql"

    _ "github.com/jinzhu/gorm/dialects/mysql"

    _ "github.com/jinzhu/gorm/dialects/postgres"

    _ "github.com/jinzhu/gorm/dialects/sqlite"

)


var db *gorm.DB


func init() {

    var err error


     db, err = gorm.Open("mysql", "gorm:gorm@tcp(localhost:9910)/gorm?charset=utf8&parseTime=True")


    if err != nil {

        panic(err)

    }

    db.LogMode(true)

}


type Res {

    Id int  `gorm:"column:id"`

    age int  `gorm:"column:age"`

}


func main() {

        var result []Res

    db.Table("A").Select("A.id,A.age").Joins("left join B on A.id=B.id").

        Where("A.age=28").

       Not("B.id", []{2,3,4,5}).

       Scan(&result)

       fmt.Printf("%v", result)

}

sql日志是:


select A.id,A.age from A left join B on A.id=B.id where a.age=28 and ABid not in(2,3,4,5)


可以看出,对表A( A.B.id not in ...)追加了not操作。如何将其附加到表 B ( B.id not in ...)?


森栏
浏览 109回答 2
2回答

喵喔喔

首先,根据我的评论:您仅用作mysql数据库,但您正在导入所有方言包(它们确实调用了它们各自的 init 函数。这些函数注册了特定于方言的回调(例如 init func在MsSQL 包中)。从导入中删除所有不使用的方言:// remove lines that I've commented out here...import (    "github.com/jinzhu/gorm"    // _ "github.com/jinzhu/gorm/dialects/mssql"     _ "github.com/jinzhu/gorm/dialects/mysql"    // _ "github.com/jinzhu/gorm/dialects/postgres"    // _ "github.com/jinzhu/gorm/dialects/sqlite")您可以将条款NOT IN的一部分移至基于文档的条件。WHEREJOIN我还会检查您可能遇到的任何错误,它们可能会在日志顶部为您提供更多调试信息:err := db.Table("A").Select("A.id,A.age").    Joins("LEFT JOIN B on A.id =  B.id AND B.id NOT IN (?)", []int{2, 3, 4, 5}).    Where("age = ?", 28).    Scan(&result).Errorif err != nil {    fmt.Fatalf("Failed to execute query: %+v", err)}fmt.Prinln(result)

三国纷争

解决使用Where("B.id not in(?)", [] {2,3,4,5}) instead of Not()有人有更好的主意吗?
随时随地看视频慕课网APP

相关分类

Go
我要回答