go - Gorm 关联 BeforeCreate 回调未按预期工作
问题描述
我有Customer
结构
type Customer struct {
Model
Email string `json:"email,omitempty"`
Addresses []Address
}
func (c *Customer) BeforeCreate() (err error) {
if err := c.GenerateID(); err != nil {
return err
}
return c.Marshal()
}
和Address
结构
type Address struct {
Model
CustomerID string
Address1 string
}
func (a *Address) BeforeCreate() error {
// The ID is still generated, but the insert query has no `id` in it
if err := a.GenerateID(); err != nil {
return err
}
return nil
}
Model
结构
type Model struct {
ID string `gorm:"primary_key;type:varchar(100)"`
CreatedAt time.Time
UpdatedAt time.Time
DeletedAt *time.Time `sql:"index"`
}
func (model *Model) GenerateID() error {
uv4, err := uuid.NewV4()
if err != nil {
return err
}
model.ID = uv4.String()
return nil
}
一个客户:
customer := &model.Customer{
Email: "a",
Addresses: []model.Address{
{
Address1: "abc street",
},
},
}
if err := gormDb.Create(customer).Error; err != nil {
return nil, err
}
I got an error: Error 1364: Field 'id' doesn't have a default value
对于地址对象
但是,如果我删除这些Address
关联,一切都会奏效。并Id
生成客户。
customer := & model.Customer{
Email: "a",
//Addresses: []model.Address{
//{
//Address1: "abc street",
//},
//},
}
如何保持Address
关联并成功插入,并且仍然使用这种 ID 生成机制?
解决方案
您可以使用scope.SetColumn
在BeforeCreate
钩子中设置字段的值
func (a *Address) BeforeCreate(scope *gorm.Scope) error {
scope.SetColumn("ID", uuid.New())
return nil
}
参考:https ://v1.gorm.io/docs/create.html#Setting-Field-Values-In-Hooks
推荐阅读
- sql-server - Ansible win_dsc 无法使用 SqlServerDsc 安装 SqlServer
- java - Rabbitmq 死信交换不起作用导致无限重试
- cordova - 带有 wkwebview 插件的 Cordova ios - window.open(url, "_system") 不起作用
- python-3.x - 如何在python中显示所有caffe层的名称?
- jenkins - 在 Jenkins 管道中的给定阶段超时后继续执行后续阶段
- python - 如果数据范围很大,如何查看数据的分布
- java - 给定 Chronology,Java Time API 从 sql Timestamp 获取偏移量
- ruby-on-rails - 除了仅验证确切的字符串之外,如何验证 Rails 形式的对象的唯一性?
- flutter - Flutter - 动态改变容器颜色
- c++ - 如何首先包含与第 3 方文件冲突的 CMake 生成的 config.h?