Go 不是()属于错误的表

Go 不是()属于错误的表,go,go-gorm,Go,Go Gorm,我使用的是go版本go1.10.3Linux/amd64和mysql 5.7 需要使用GORM的docker compose配置运行,或者请提供您的配置 package main import ( "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mssql" _ "github.com/jinzhu/gorm/dialects/mysql" _ "github.com/jinzhu/gorm

我使用的是go版本go1.10.3Linux/amd64和mysql 5.7

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

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日志为:

从A.id=B.id上的左连接B中选择A.id、A.age,其中A.age=28和A.B.id不在(2,3,4,5)中

可以看出,not操作是为表A追加的(
A.B.id不在…
)。如何将其附加到表B(
B.id不在…
)中?

已解决

使用


有人有更好的主意吗?

首先,根据我的评论:您只使用
mysql
作为数据库,但您正在导入所有方言包(它们调用各自的init函数。这些函数注册特定于方言的回调(例如init func in).从导入中删除所有不使用的方言:

// 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"
)
您可以将
WHERE
子句的
NOT IN
部分中的
移动到基于的
JOIN
条件

我还将检查您可能遇到的任何错误,它们可能会在日志顶部为您提供更多调试信息:

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).Error
if err != nil {
    fmt.Fatalf("Failed to execute query: %+v", err)
}
fmt.Prinln(result)

很明显,您正在连接MySQL数据库,为什么要导入所有方言?删除所有方言导入,除了
\uuhub.com/jinju/gorm/dialogons/MySQL“
是的,我最后也这么做了,我对给定的方法Not()感到困惑,因为这是您最终选择的答案,您介意将其标记为已接受吗?
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).Error
if err != nil {
    fmt.Fatalf("Failed to execute query: %+v", err)
}
fmt.Prinln(result)