【问题标题】:Why does foreign key not get generated with GORM?为什么 GORM 不能生成外键?
【发布时间】:2020-05-07 05:55:25
【问题描述】:

我试图在Password 表上创建一个外键,它必须指向User 表内的id 列。但是当我尝试以下操作时,它不起作用。 foreign key 未生成。它只是在password 表中添加列名user_id

package schema

import (
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)

type User struct {
    gorm.Model
    FirstName string `gorm:"not null"`
    LastName string `gorm:"not null"`
    Email string `gorm:"type:varchar(100);unique_index"`
    IsActive bool `gorm:"not null"`
    IsVerified bool `gorm:"not null"`
}

type Password struct {
    gorm.Model
    Password string `gorm:"not null"`
    UserId int `gorm:"not null"`
    User User `gorm:"foreignkey:UserId;association_foreignkey:id"`
}


func SyncDB(db *gorm.DB) {

    db.AutoMigrate(&User{})
    db.AutoMigrate(&Password{})
}

我做错了什么?如何在 Password 表中创建指向 User 表的外键?

【问题讨论】:

  • 在 mysql 中,您必须在用户中有一个 id(并且需要对其进行索引)才能使 FK 有效。我不了解 gorm - 它对你有用吗?
  • 您在用户字段的 gorm 标记中放错了右双引号。运行go vet 查找此类错误。
  • @Peter 更新了我的问题。即使修复了双引号,它也不起作用
  • @Peter 在看到使用show create table password 的架构时,我找不到任何外键约束

标签: mysql go go-gorm


【解决方案1】:

我认为你需要:

db.Model(&Password{}).AddForeignKey("user_id", "users(id)", "RESTRICT", "RESTRICT")

我把我的放在我的自动迁移语句之后

db.AutoMigrate(&User{}, &Password{})
db.Model(&Password{}).AddForeignKey("user_id", "users(id)", "RESTRICT", "RESTRICT")

如果这有帮助,请告诉我。

【讨论】:

    【解决方案2】:

    试试这个。

    type Password struct {
       gorm.Model
       Password string `gorm:"not null"`
       UserId int `gorm:"not null"`
       User User `gorm:"foreignkey:UserId;references:id"`
    }
    

    【讨论】:

    • 这也会将用户列添加到密码表中。
    猜你喜欢
    • 1970-01-01
    • 2012-10-31
    • 2010-10-21
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多