Not() 属于错误 table
Not() belongs wrong table
我正在使用 go 版本 go1.10.3 linux/amd64 和 mysql 5.7.
需要使用 GORM 的 docker 组合配置运行,或者请提供您的配置。
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 A.B.id not in(2,3,4,5)
可以看出,对tableA(A.B.id not in ...
)追加了not操作。怎么才能追加到tableB(B.id not in ...
)?
已解决
使用
Where("B.id not in(?)", [] {2,3,4,5}) instead of Not()
有人有更好的主意吗?
首先,根据我的评论:您仅将 mysql
用作数据库,但您正在导入所有方言包(它们会调用各自的初始化函数。这些函数注册回调特定于方言的方言(例如 the MsSQL package 中的 init 函数)。从导入中删除所有不使用的方言:
// 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
部分移动到基于 the documentation.
的 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)
我正在使用 go 版本 go1.10.3 linux/amd64 和 mysql 5.7.
需要使用 GORM 的 docker 组合配置运行,或者请提供您的配置。
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 A.B.id not in(2,3,4,5)
可以看出,对tableA(A.B.id not in ...
)追加了not操作。怎么才能追加到tableB(B.id not in ...
)?
已解决
使用
Where("B.id not in(?)", [] {2,3,4,5}) instead of Not()
有人有更好的主意吗?
首先,根据我的评论:您仅将 mysql
用作数据库,但您正在导入所有方言包(它们会调用各自的初始化函数。这些函数注册回调特定于方言的方言(例如 the MsSQL package 中的 init 函数)。从导入中删除所有不使用的方言:
// 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
部分移动到基于 the documentation.
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)