【问题标题】:Unable to create foreign-key relationship with gorm where field name != type name无法与字段名称!= 类型名称的 gorm 创建外键关系
【发布时间】:2023-04-01 10:50:01
【问题描述】:

我正在尝试在我的应用程序中创建“属于”关系,其中字段(和 db 列)的名称与类型名称不同。 Gorm 对此表示不满。这是一个演示问题的简短示例:

package main

import (
    "fmt"
    "github.com/jinzhu/gorm"
    _ "github.com/mattn/go-sqlite3"
)

type Car struct {
    gorm.Model
    Owner   User
    OwnerID int
}

type User struct {
    gorm.Model
}

func main() {
    db, _ := gorm.Open("sqlite3", "test.db")
    defer db.Close()
    db.LogMode(true)

    db.CreateTable(&Car{}, &User{})

    u := User{}
    u.ID = 1
    db.Create(&u)

    c := Car{}
    c.ID = 1
    c.Owner = u
    db.Create(&c)

    cars := make([]Car, 5)
    db.Find(&cars)
    for i := range cars {
        db.Model(cars[i]).Related(&cars[i].Owner)
    }

    for i := range cars {
        fmt.Println(cars[i].Owner.ID)
    }
}

我们希望这个程序在最后一行打印出“1”,因为这是“拥有”数据库中唯一汽车的用户关系的主键。而是打印出“0”,并且详细日志记录在Related(&cars[i].Owner) 步骤显示错误:

(/home/nate/gocode/src/foo/main.go:26)
[2016-04-09 19:33:46]  [122.35ms]  CREATE TABLE "cars" ("id" integer primary key autoincrement,"created_at" datetime,"updated_at" datetime,"deleted_at" datetime,"owner_id" integer )

(/home/nate/gocode/src/foo/main.go:26)
[2016-04-09 19:33:46]  [98.96ms]  CREATE INDEX idx_cars_deleted_at ON "cars"(deleted_at)

(/home/nate/gocode/src/foo/main.go:26)
[2016-04-09 19:33:46]  [108.95ms]  CREATE TABLE "users" ("id" integer primary key autoincrement,"created_at" datetime,"updated_at" datetime,"deleted_at" datetime )

(/home/nate/gocode/src/foo/main.go:26)
[2016-04-09 19:33:46]  [125.74ms]  CREATE INDEX idx_users_deleted_at ON "users"(deleted_at)

(/home/nate/gocode/src/foo/main.go:30)
[2016-04-09 19:33:46]  [0.53ms]  INSERT INTO "users" ("id","created_at","updated_at","deleted_at") VALUES ('1','2016-04-09T19:33:46-04:00','2016-04-09T19:33:46-04:00','<nil>')

(/home/nate/gocode/src/foo/main.go:35)
[2016-04-09 19:33:46]  [1.98ms]  UPDATE "users" SET "created_at" = '2016-04-09T19:33:46-04:00', "updated_at" = '2016-04-09T19:33:46-04:00', "deleted_at" = '<nil>'  WHERE "users".deleted_at IS NULL AND "users"."id" = '1'

(/home/nate/gocode/src/foo/main.go:35)
[2016-04-09 19:33:46]  [0.43ms]  INSERT INTO "cars" ("id","created_at","updated_at","deleted_at","owner_id") VALUES ('1','2016-04-09T19:33:46-04:00','2016-04-09T19:33:46-04:00','<nil>','1')

(/home/nate/gocode/src/foo/main.go:38)
[2016-04-09 19:33:46]  [0.64ms]  SELECT * FROM "cars"  WHERE "cars".deleted_at IS NULL

(/home/nate/gocode/src/foo/main.go:40)
[2016-04-09 19:33:46]  invalid association []
0

这里发生了什么?我必须在Owner 字段上使用一些特殊标签吗?我试过使用gorm:"ForeignKey:owner_id"gorm:"AssociationForeignKey:owner_id",都给出了相同的结果。

【问题讨论】:

    标签: go go-gorm


    【解决方案1】:

    在您的情况下,最简单的方法是指定外部字段名称。所以你的

    db.Model(cars[i]).Related(&cars[i].Owner)
    

    应该是这样的

    db.Model(cars[i]).Related(&cars[i].Owner, "Owner")
    

    替代方法是

    • OwnerOwnerID 字段重命名为 UserUserID
    • User 结构重命名为Owner

    在这些情况下,GORM 会自动选择正确的外键。来自GORM documentation about associations

    如果字段名称与变量的类型名称相同,则可以省略。

    【讨论】:

    猜你喜欢
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 2014-12-19
    • 1970-01-01
    • 2015-04-09
    • 1970-01-01
    • 2021-09-05
    • 2021-07-31
    相关资源
    最近更新 更多