perf(*): 创作工作台 - 优化首页按需加载与画布交互并修复历史迁移冲突
This commit is contained in:
1 parent
ca7ad1f9b2
commit
711d1b79eb
107 files changed
+3025
-1089
No files matched your search
@@ -10,7 +10,7 @@ import (
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
const CurrentSchemaVersion int64 = 7
|
||||
const CurrentSchemaVersion int64 = 8
|
||||
|
||||
const baselineSchemaChecksum = "sha256:open-ai-canvas-schema-v1-20260830"
|
||||
const schemaMigrationAppliedAtIndexChecksum = "sha256:schema-migrations-applied-at-index-v2-20260830"
|
||||
@@ -19,6 +19,7 @@ const resourceUploadKeyChecksum = "sha256:resource-upload-key-v4-20260901"
|
||||
const paymentTopupChecksum = "sha256:payment-topup-v5-20260902"
|
||||
const resourcePlaybackChecksum = "sha256:resource-playback-v6-20260902"
|
||||
const assetLibraryFoldersChecksum = "sha256:asset-library-folders-v6-20260902"
|
||||
const logicalModelActiveCodeChecksum = "sha256:logical-model-active-code-v8-20260905"
|
||||
|
||||
const postgresSchemaMigrationLockID int64 = 73123910420260830
|
||||
|
||||
@@ -52,6 +53,35 @@ var schemaMigrations = []migration{
|
||||
{version: 5, name: "payment_topup", checksum: paymentTopupChecksum, apply: migrateSchemaV5},
|
||||
{version: 6, name: "resource_playback_variant", checksum: resourcePlaybackChecksum, apply: migrateSchemaV6},
|
||||
{version: 7, name: "asset_library_folders", checksum: assetLibraryFoldersChecksum, apply: migrateSchemaV7},
|
||||
{version: 8, name: "logical_model_active_code", checksum: logicalModelActiveCodeChecksum, apply: migrateSchemaV8},
|
||||
}
|
||||
|
||||
func migrationsForDatabase(db *gorm.DB) ([]migration, error) {
|
||||
var applied schemaMigration
|
||||
err := db.First(&applied, "version = ?", 6).Error
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return schemaMigrations, nil
|
||||
}
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("读取数据库迁移 6:%w", err)
|
||||
}
|
||||
if applied.Name != "asset_library_folders" {
|
||||
return schemaMigrations, nil
|
||||
}
|
||||
legacy := migration{version: 6, name: "asset_library_folders", checksum: assetLibraryFoldersChecksum, apply: migrateSchemaV7}
|
||||
if err := validateMigrationRecord(applied, legacy); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
plan := append([]migration(nil), schemaMigrations...)
|
||||
for index, item := range plan {
|
||||
switch item.version {
|
||||
case 6:
|
||||
plan[index] = legacy
|
||||
case 7:
|
||||
plan[index] = migration{version: 7, name: "resource_playback_variant", checksum: resourcePlaybackChecksum, apply: migrateSchemaV6}
|
||||
}
|
||||
}
|
||||
return plan, nil
|
||||
}
|
||||
|
||||
func migrateSchemaV2(tx *gorm.DB) error {
|
||||
@@ -155,6 +185,19 @@ func migrateSchemaV7(tx *gorm.DB) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func migrateSchemaV8(tx *gorm.DB) error {
|
||||
if !tx.Migrator().HasTable(&model.LogicalModel{}) {
|
||||
return nil
|
||||
}
|
||||
if err := tx.Exec("DROP INDEX IF EXISTS idx_logical_models_code").Error; err != nil {
|
||||
return fmt.Errorf("移除前台模型旧 code 唯一索引:%w", err)
|
||||
}
|
||||
if err := tx.Exec("CREATE UNIQUE INDEX idx_logical_models_code ON logical_models(code) WHERE archived_at IS NULL").Error; err != nil {
|
||||
return fmt.Errorf("创建前台模型活动 code 唯一索引:%w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func MigrateSchema(db *gorm.DB) error {
|
||||
return db.Transaction(func(tx *gorm.DB) error {
|
||||
if tx.Dialector.Name() == "postgres" {
|
||||
@@ -165,7 +208,11 @@ func MigrateSchema(db *gorm.DB) error {
|
||||
if err := tx.AutoMigrate(&schemaMigration{}); err != nil {
|
||||
return fmt.Errorf("初始化数据库迁移记录:%w", err)
|
||||
}
|
||||
for _, item := range schemaMigrations {
|
||||
plan, err := migrationsForDatabase(tx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for _, item := range plan {
|
||||
var applied schemaMigration
|
||||
err := tx.First(&applied, "version = ?", item.version).Error
|
||||
if err == nil {
|
||||
@@ -208,7 +255,11 @@ func ReadSchemaStatus(db *gorm.DB) (SchemaStatus, error) {
|
||||
}
|
||||
|
||||
func validateMigrationRecords(db *gorm.DB) error {
|
||||
for _, item := range schemaMigrations {
|
||||
plan, err := migrationsForDatabase(db)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for _, item := range plan {
|
||||
var applied schemaMigration
|
||||
if err := db.First(&applied, "version = ?", item.version).Error; err != nil {
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
|
||||
Reference in new issue
Block a user