From 39d72a7545e1559fafcf98a569768f5e8fc5b2d7 Mon Sep 17 00:00:00 2001 From: TethysPlex <180962954+TethysPlex@users.noreply.github.com> Date: Sat, 1 Nov 2025 11:49:22 +1100 Subject: [PATCH 1/2] fix: fix batch inserts for large project imports --- internal/apps/project/models.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/internal/apps/project/models.go b/internal/apps/project/models.go index 5b76df3..f8ea534 100644 --- a/internal/apps/project/models.go +++ b/internal/apps/project/models.go @@ -47,6 +47,11 @@ import ( "gorm.io/gorm" ) +const ( + // projectItemInsertBatchSize limits batch inserts to avoid exceeding MySQL's placeholder ceiling. + projectItemInsertBatchSize = 1000 +) + type Project struct { ID string `json:"id" gorm:"primaryKey;size:64"` Name string `json:"name" gorm:"size:32"` @@ -239,7 +244,7 @@ func (p *Project) CreateItems(ctx context.Context, tx *gorm.DB, items []string, projectItems[i] = wi.item } - if err := tx.Create(&projectItems).Error; err != nil { + if err := tx.CreateInBatches(&projectItems, projectItemInsertBatchSize).Error; err != nil { return err } @@ -259,7 +264,7 @@ func (p *Project) CreateItems(ctx context.Context, tx *gorm.DB, items []string, projectItems[i] = ProjectItem{ProjectID: p.ID, Content: content} } - if err := tx.Create(&projectItems).Error; err != nil { + if err := tx.CreateInBatches(&projectItems, projectItemInsertBatchSize).Error; err != nil { return err } From ebdd3503696d9955c710f8daadf2c7b9a27daf15 Mon Sep 17 00:00:00 2001 From: TethysPlex <180962954+TethysPlex@users.noreply.github.com> Date: Sat, 1 Nov 2025 13:58:25 +1100 Subject: [PATCH 2/2] =?UTF-8?q?refactor:=20=E7=A7=BB=E5=8A=A8=20projectIte?= =?UTF-8?q?mInsertBatchSize=20=E5=B8=B8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将 `projectItemInsertBatchSize` 常量从 `models.go` 移动到 `constants.go`,以更好地组织项目常量,并避免循环依赖。 --- internal/apps/project/constants.go | 2 ++ internal/apps/project/models.go | 5 ----- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/internal/apps/project/constants.go b/internal/apps/project/constants.go index 253ebe9..05d2a0d 100644 --- a/internal/apps/project/constants.go +++ b/internal/apps/project/constants.go @@ -26,6 +26,8 @@ package project const ( ProjectObjKey = "project_obj" + // projectItemInsertBatchSize limits batch inserts to avoid exceeding MySQL's placeholder ceiling. + projectItemInsertBatchSize = 1000 ) type DistributionType int8 diff --git a/internal/apps/project/models.go b/internal/apps/project/models.go index f8ea534..1514f30 100644 --- a/internal/apps/project/models.go +++ b/internal/apps/project/models.go @@ -47,11 +47,6 @@ import ( "gorm.io/gorm" ) -const ( - // projectItemInsertBatchSize limits batch inserts to avoid exceeding MySQL's placeholder ceiling. - projectItemInsertBatchSize = 1000 -) - type Project struct { ID string `json:"id" gorm:"primaryKey;size:64"` Name string `json:"name" gorm:"size:32"`