Not () принадлежит неверной таблице - PullRequest
0 голосов
/ 18 сентября 2018

Я использую go-версию go1.10.3 linux / amd64 и mysql 5.7.

Требуется запуск с помощью докера GORM 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)
}

Журнал sqlis:

выберите A.id, A.age из левого объединения B на A.id = B.id, где a.age = 28 и ABid нет в (2,3,4,5))

Как видно, операция not добавлена ​​к таблице A (A.B.id not in ...).Как его можно добавить в таблицу B (B.id not in ...)?

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Прежде всего, согласно моему комментарию: вы используете mysql только как БД, и все же вы импортируете все пакеты диалектов (которые вызывают их соответствующие функции инициализации. Эти функции регистрируют обратные вызовы, которые являются диалектамиспецифические (например, функция инициализации в пакете 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 частьWHERE условие 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)
0 голосов
/ 18 сентября 2018

решено

использовать

Where("B.id not in(?)", [] {2,3,4,5}) instead of Not()

у кого есть идея получше?

...