Skip to content

使用Callback填充uuid,批量插入的时候,最后一条数据id为空 #7552

@duguying

Description

@duguying

GORM Playground Link

结构体

// UUID UUID
type UUID struct {
	Id string `gorm:"type:varchar(40);primary_key;" sql:"comment:'UUID'"`
}

type DomainCLB struct {
	UUID

	DomainID string `gorm:"column:domain_id;type:varchar(64);not null;index:idx_domain_clb,unique" json:"domain_id"`
	CLBUUID  string `gorm:"column:clb_uuid;type:varchar(64);not null;index:idx_domain_clb,unique" json:"clb_uuid"`
	CLBID    string `gorm:"column:clb_id;type:varchar(64);not null;index:idx_domain_clb,unique" json:"clb_id"`
	CLBName  string `gorm:"column:clb_name;type:varchar(128);not null" json:"clb_name"`
	VIP      string `gorm:"column:vip;type:varchar(64);not null" json:"vip"`
	Region   string `gorm:"column:region;type:varchar(64);not null" json:"region"`
	Operator string `gorm:"column:operator;type:varchar(64);not null" json:"operator"`

	UpdatedAt time.Time `json:"updated_at" sql:"comment:'最后更新时间'"`
	CreatedAt time.Time `json:"created_at" sql:"comment:'创建时间'"`
}

注册Callback

instance.Callback().Create().Before("gorm:create").Register("before_create_v2", func(db *gormv2.DB) {
	if db.Statement.Schema != nil {
		db.Statement.SetColumn("Id", uuid.New().String())
	} else {
		log.Println("gormv2 callback: schema is nil, cannot set Id")
	}
})

调用批量插入

func foobar() error {
    var domainClbList []*dbmodels.DomainCLB
    for _, clb := range accClbList {
    	domainClbList = append(domainClbList, &dbmodels.DomainCLB{
    		DomainID: domainId,
    		CLBUUID:  clb.Id,
    		CLBID:    clb.ClbId,
    		CLBName:  clb.ClbName,
    		VIP:      clb.Vip,
    		Region:   clb.CRegion,
    		Operator: clb.Operator,
    	})
    }
    
    ...
    
    return d.txv2.WithContext(ctx).Model(dbmodels.DomainCLB{}).CreateInBatches(domainClbList, len(domainClbList)).Error
}

结果插入的语句为

INSERT INTO `t_domain_clbs` (
        `id`,
        `domain_id`,
        `clb_uuid`,
        `clb_id`,
        `clb_name`,
        `vip`,
        `region`,
        `operator`,
        `updated_at`,
        `created_at`
    )
VALUES (
        '98e2d711-de27-4138-82c1-95d933298e0b',
        'c1b6277b-9373-49a8-a341-b0526a360d4d',
        '57418e89-fd39-4e8b-a3d2-ae468d8c3374',
        'xxxxx',
        'test-xx-8iczh42p',
        'xxxxx',
        'ap-tianjin',
        'telecom',
        '2025-08-07 19:58:16.866',
        '2025-08-07 19:58:16.866'
    ),
(
        '',
        'c1b6277b-9373-49a8-a341-b0526a360d4d',
        '729ca8b6-a15a-446f-9fe3-c058aecabdaa',
        'xxxxx',
        'test-xx-01edxna0',
        'xxxxx',
        'ap-shenzhen',
        'telecom',
        '2025-08-07 19:58:16.866',
        '2025-08-07 19:58:16.866'
    )

可以看到最后一条数据的id有问题

go-gorm/playground#1

Description

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions