#mysql #go #go-gorm
#mysql #Вперед #go-gorm
Вопрос:
итак, у меня есть 2 таблицы в отношении ноль ко многим. (Каждый File
может иметь не более 1 User
).
type User struct {
gorm.Model
}
и
type File struct {
gorm.Model
UserID int `gorm:"default:null"`
User User `gorm:"constraint:OnUpdate:CASCADE,OnDelete:SET NULL;foreignKey:UserID"`
}
Теперь, в MySQL (эта проблема не возникает с SQLite), я получаю следующую ошибку, если не создан пользователь, и я обновляю файл с пустым пользователем:
Error 1452: Cannot add or update a child row: a foreign key constraint fails (`DB`.`files`, CONSTRAINT `fk_files_creator` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE)
UPDATE `files` SET `user_id`=0,`deleted_at`=NULL WHERE `id` = 5
Это связано с тем, что он пытается добавить «0» user_id
, как и должно быть NULL
. Вот так:
UPDATE `files` SET `user_id`=NULL,`deleted_at`=NULL WHERE `id` = 5
Мне удалось исправить это для создания using default:null
, но есть идеи, как это сделать и для обновления? Спасибо!
Ответ №1:
Вы можете использовать pointers ( *
) для обнуляемых значений:
type File struct {
gorm.Model
UserID *int
User *User `gorm:"constraint:OnUpdate:CASCADE,OnDelete:SET NULL;foreignKey:UserID"`
}
И для реализации отношений ноль-ко-многим требуется что-то вроде list
s . Например:
type User struct {
gorm.Model
Files []File `json:"partList" gorm:"many2many:files_relation_table;"`
}