使用gorm插入表时,外键约束失败



当我试图用gorm插入一个具有一对多关系的表时,我会得到以下错误:

Error 1452: Cannot add or update a child row: a foreign key constraint fails (`Todo`.`todos`, CONSTRAINT `fk_users_todo_list` FOREIGN KEY (`fk_id`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE)....

这些是我的型号:

type Base struct {
ID        uint `gorm:"primaryKey"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt *time.Time `gorm:"index"`
}
type User struct {
Base
FirstName string           `form:"first_name" gorm:"type:varchar(20)"`
LastName  string           `form:"last_name" gorm:"type:varchar(20)"`
UserName  string           `form:"user_name" gorm:"unique;type:varchar(20)"`
Email     string           `form:"email" gorm:"type:varchar(100)"`
Password  string           `form:"password" gorm:"type:varchar(30)"`
Gender    types.UserGender `form:"gender" gorm:"type:smallint"`
TodoList  []Todo           `gorm:"foreignKey:FkID;constraint:onDelete:SET NULL,onUpdate:CASCADE" json:"omitempty"`
}
type Todo struct {
Base
Name        string
Description string
Status      types.TaskStatus
FkID        uint
}

这就是我写的函数:

func (d *DB) AddTODO(todo *models.Todo, userName string) error {
user := &models.User{UserName: userName}
err := d.db.Model(&user).Where("user_name = ?", userName).Association("TodoList").
Append([]models.Todo{*todo})
if err != nil {
return err
}
return nil
}

我正在使用MariaDB。

它需要gorm结果中的user。改变你的方法也许是这样的:

// arg user is from gorm result somewhere
func (d *DB) AddTODO(user *models.User, todo *models.Todo) error {
return d.db.Model(user).Association("TodoList").Append([]models.Todo{*todo})
}

TodoList缺少references关键字。应该是这样的。

type User struct {
Base
FirstName string           `form:"first_name" gorm:"type:varchar(20)"`
LastName  string           `form:"last_name" gorm:"type:varchar(20)"`
UserName  string           `form:"user_name" gorm:"unique;type:varchar(20)"`
Email     string           `form:"email" gorm:"type:varchar(100)"`
Password  string           `form:"password" gorm:"type:varchar(30)"`
Gender    types.UserGender `form:"gender" gorm:"type:smallint"`
TodoList  []Todo           `gorm:"foreignKey:FkID;references:ID;constraint:onDelete:SET NULL,onUpdate:CASCADE" json:"omitempty"`
}

相关内容

  • 没有找到相关文章

最新更新