postgresql 错误:使用GORM时缺少表的FROM子句条目

3gtaxfhh  于 2022-12-22  发布在  PostgreSQL
关注(0)|答案(2)|浏览(233)

这些是我的数据库中的表

CREATE TABLE vehicles
(
    id          VARCHAR PRIMARY KEY,
    make        VARCHAR NOT NULL,
    model       VARCHAR NOT NULL,
)

CREATE TABLE collisions
(
    id            VARCHAR PRIMARY KEY,
    longitude     FLOAT NOT NULL,
    latitude      FLOAT NOT NULL,
)

CREATE TABLE vehicle_collisions
(   
    vehicle_id    VARCHAR NOT NULL,
    collision_id  VARCHAR NOT NULL,
    PRIMARY KEY (vehicle_id, collision_id)
)

所以我需要找到一个特定的碰撞标识符的车辆列表。我使用的是gorm。
我试着用一种

var vehicles []entities.Vehicles
    err := r.db.Joins("JOIN vehicles as vh on vh.id=vehicle_collisions.vehicle_id").Where("vehicle_collisions.collision_id=?",
        id).Find(&vehicles).Error
    if err != nil {
        fmt.Println(err)
    }

但这让我犯错

ERROR: missing FROM-clause entry for table "vehicle_collisions" (SQLSTATE 42P01)

任何帮助都将不胜感激。

nfeuvbwi

nfeuvbwi1#

谢谢mkopriva,当您传递&vehicles(即[]entities.Vehicles)以查找时,生成的查询将如下所示:

SELECT
  *
FROM
  vehicles
JOIN
  vehicles vh
ON vh.id = vehicle_collisions.vehicle_id
WHERE vehicle_collisions.collision_id=1

这将是不正确的解决问题修改查询为:

err := r.db.
    Joins("JOIN vehicle_collisions AS vc ON vc.vehicle_id=vehicles.id").
    Where("vc.collision_id = ?", id).
    Find(&vehicles).Error
6ie5vjzr

6ie5vjzr2#

由于这个问题缺少一些细节,我试着猜测它们。我希望提供的答案与您相关!让我展示一下我这边的代码:

package main

import (
    "gorm.io/driver/postgres"
    "gorm.io/gorm"

    _ "github.com/lib/pq"
)

type Vehicle struct {
    Id         string
    Make       string
    Model      string
    Collisions []Collision `gorm:"many2many:vehicle_collisions"`
}

type Collision struct {
    Id        string
    Longitude float64
    Latitude  float64
}

func main() {
    dsn := "host=localhost user=postgres password=postgres dbname=postgres port=5432 sslmode=disable"
    db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
    if err != nil {
        panic(err)
    }

    db.AutoMigrate(&Vehicle{})
    db.AutoMigrate(&Collision{})

    // add dummy data to the db
    collision := &Collision{"1", 4.4, 4.5}
    db.Create(collision)
    db.Create(&Collision{"2", 1.1, 1.5})
    db.Create(&Vehicle{Id: "1", Make: "ford", Model: "fiesta", Collisions: []Collision{*collision}})
    db.Create(&Vehicle{Id: "2", Make: "fiat", Model: "punto", Collisions: []Collision{*collision}})

    // get all vehicles for collision 1
    var vehicles []Vehicle
    db.Debug().Joins("inner join vehicle_collisions vc on vehicles.id = vc.vehicle_id").Find(&vehicles, "vc.collision_id = ?", "1")
}

代码从结构体的定义开始。
请注意字段Collisions上的Gorm注解。
添加一些数据后,查询应该非常简单:我们使用Joins方法从表vehicle_collisions加载数据,并且在Find方法中,我们仅过滤掉collision_id等于"1"的记录。
如果这对你有帮助或者你需要别的东西,请告诉我!

相关问题