fix(database): 素材存储 - 扩容生成素材 ID 及关联字段

This commit is contained in:
ddCat
2026-08-15 17:00:17 +08:00
parent 0e251c3c8f
commit 5dfd74d938
4 changed files with 222 additions and 4 deletions

View File

@@ -1,6 +1,10 @@
package database
import (
"database/sql"
"errors"
"fmt"
"infinite-canvas/backend/internal/model"
"gorm.io/gorm"
@@ -71,6 +75,9 @@ func MigrateSchema(db *gorm.DB) error {
return err
}
}
if err := widenPostgresAssetIDColumns(db); err != nil {
return err
}
if err := db.AutoMigrate(Models()...); err != nil {
return err
}
@@ -83,3 +90,44 @@ func MigrateSchema(db *gorm.DB) error {
}
return db.Exec("CREATE UNIQUE INDEX IF NOT EXISTS idx_users_email_nonempty ON users(lower(email)) WHERE email <> ''").Error
}
type varcharColumnMigration struct {
table string
column string
statement string
}
var assetIDColumnMigrations = []varcharColumnMigration{
{table: "assets", column: "id", statement: `ALTER TABLE "assets" ALTER COLUMN "id" TYPE varchar(80)`},
{table: "project_asset_links", column: "asset_id", statement: `ALTER TABLE "project_asset_links" ALTER COLUMN "asset_id" TYPE varchar(80)`},
{table: "project_asset_candidates", column: "resolved_asset_id", statement: `ALTER TABLE "project_asset_candidates" ALTER COLUMN "resolved_asset_id" TYPE varchar(80)`},
{table: "asset_versions", column: "asset_id", statement: `ALTER TABLE "asset_versions" ALTER COLUMN "asset_id" TYPE varchar(80)`},
}
// PostgreSQL Migrator 跳过主键列变更,素材 ID 扩容必须在 AutoMigrate 前显式执行。
func widenPostgresAssetIDColumns(db *gorm.DB) error {
if db.Dialector.Name() != "postgres" {
return nil
}
for _, migration := range assetIDColumnMigrations {
var currentLength sql.NullInt64
err := db.Raw(
"SELECT character_maximum_length FROM information_schema.columns WHERE table_schema = current_schema() AND table_name = ? AND column_name = ?",
migration.table,
migration.column,
).Row().Scan(&currentLength)
if errors.Is(err, sql.ErrNoRows) {
continue
}
if err != nil {
return fmt.Errorf("检查 PostgreSQL 素材 ID 列 %s.%s:%w", migration.table, migration.column, err)
}
if !currentLength.Valid || currentLength.Int64 >= model.AssetIDMaxLength {
continue
}
if err := db.Exec(migration.statement).Error; err != nil {
return fmt.Errorf("扩容 PostgreSQL 素材 ID 列 %s.%s:%w", migration.table, migration.column, err)
}
}
return nil
}