为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用gorm制作外键

如何使用gorm制作外键

Go
互换的青春 2023-05-02 10:19:57
我有这两个模型:用户模型:type User struct {    DBBase    Email    string `gorm:"column:email" json:"email"`    Password string `gorm:"column:password" json:"-"`}func (User) TableName() string {    return "t_user"}用户信息模型:type UserInfo struct {    User      User   `gorm:"foreignkey:u_id;association_foreignkey:id"`    UID       uint   `gorm:"column:u_id" json:"-"`    FirstName string `gorm:"column:first_name" json:"first_name"`    LastName  string `gorm:"column:last_name" json:"last_name"`    Phone     string `gorm:"column:phone" json:"phone"`    Address   string `gorm:"column:address" json:"address"`}func (UserInfo) TableName() string {    return "t_user_info"}我想让 UID 与用户表的 ID 相关。这是创建用户的函数:func (dao *AuthDAO) Register(rs app.RequestScope, user *models.User, userInfo *models.UserInfo) (userErr error, userInfoErr error) {    createUser := rs.Db().Create(&user)    userInfo.UID = user.ID    createUserInfo := rs.Db().Create(&userInfo)    return createUser.Error, createUserInfo.Error}我确实尝试了 gorm 在文档中写的内容,但没有成功: http://doc.gorm.io/associations.html
查看完整描述

4 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

笔记!

从 gorm 2.0 开始,这不再是必需的

解决办法是在迁移数据库的时候加入这一行:

db.Model(&models.UserInfo{}).AddForeignKey("u_id", "t_user(id)", "RESTRICT", "RESTRICT")



查看完整回答
反对 回复 2023-05-02
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

我发现以下代码无需执行任何自定义迁移代码即可正确创建外键;只是平常的AutoMigrate。



type Account struct {

    ID uint `gorm:"primary_key"`

}


type Transaction struct {

    ID        uint `gorm:"primary_key"`

    AccountID uint

    Account   Account `gorm:"constraint:OnUpdate:CASCADE,OnDelete:CASCADE;"`

}


我正在使用“Gorm 2.0”,它是gorm.io/gorm v1.23.3.


查看完整回答
反对 回复 2023-05-02
?
红颜莎娜

TA贡献1842条经验 获得超12个赞

阅读https://gorm.io/docs/belongs_to.html中的属于关系 此外,这里有一个很好的例子: https: //medium.com/@the.hasham.ali/how-to-use-uuid -key-type-with-gorm-cc00d4ec7100


// User is the model for the user table.

type User struct {

 Base

 SomeFlag bool    `gorm:"column:some_flag;not null;default:true"`

 Profile  Profile

}// Profile is the model for the profile table.

type Profile struct {

 Base

 Name   string    `gorm:"column:name;size:128;not null;"`

 UserID uuid.UUID `gorm:"type:uuid;column:user_foreign_key;not null;"`

}


查看完整回答
反对 回复 2023-05-02
?
aluckdog

TA贡献1847条经验 获得超7个赞

我们可以在最新版本中使用添加外键约束CreateConstraint。


示例:假设我们有两个实体


type User struct {

  gorm.Model

  CreditCards []CreditCard

}


type CreditCard struct {

  gorm.Model

  Number string

  UserID uint

}

现在为用户和信用卡创建数据库外键


db.Migrator().CreateConstraint(&User{}, "CreditCards")

db.Migrator().CreateConstraint(&User{}, "fk_users_credit_cards")

转换为 Postgres 的以下 SQL 代码:


ALTER TABLE `credit_cards` ADD CONSTRAINT `fk_users_credit_cards` FOREIGN KEY (`user_id`) REFERENCES `users`(`id`)


查看完整回答
反对 回复 2023-05-02
  • 4 回答
  • 0 关注
  • 256 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信