// Command backfill_title_cn 把 brand_runway.title_cn 由已解析的结构化分类字段 // (year / collection_type / season)规则生成中文走秀标题。 // // 设计: // - title 字段本质就是「季节/品类描述」(Vogue 格式:Spring 2026 Ready-to-Wear、 // Resort 2026、Pre-Fall 2023、Fall 2023 Couture、Spring 2024 Menswear), // 品牌名在 JOIN 出的 brand_name 里单独给,不混进 title。 // - collection_type / season 早已由历史迁移解析回填,因此 title_cn 可纯规则生成, // 完全不依赖外部翻译服务,且结果稳定可重跑。 // // 幂等:每次都按分类字段重新计算并整表覆盖,重跑无害。 // 不写任何业务逻辑,仅做一次性数据回填。 package main import ( "fmt" "log" "gorm.io/driver/mysql" "gorm.io/gorm" ) const dsn = "root:root@tcp(127.0.0.1:3306)/db?charset=utf8mb4&parseTime=True&loc=Local" // titleCnSQL 单条 UPDATE 用 CASE 把分类字段映射为中文标题。 // year 参与拼接(CONCAT),season 为 NULL 时 COALESCE 成 ''。 const titleCnSQL = ` UPDATE brand_runway SET title_cn = CASE WHEN collection_type = 'resort' THEN CONCAT(year, ' 度假系列') WHEN collection_type = 'pre_fall' THEN CONCAT(year, ' 早秋系列') WHEN collection_type = 'rtw' AND season = 'spring' THEN CONCAT(year, ' 春夏成衣') WHEN collection_type = 'rtw' AND season = 'fall' THEN CONCAT(year, ' 秋冬成衣') WHEN collection_type = 'rtw' THEN CONCAT(year, ' 成衣') WHEN collection_type = 'menswear' AND season = 'spring' THEN CONCAT(year, ' 春夏男装') WHEN collection_type = 'menswear' AND season = 'fall' THEN CONCAT(year, ' 秋冬男装') WHEN collection_type = 'couture' AND season = 'spring' THEN CONCAT(year, ' 春夏高定') WHEN collection_type = 'couture' AND season = 'fall' THEN CONCAT(year, ' 秋冬高定') ELSE CONCAT(year, ' 系列') END WHERE is_deleted = 0` func main() { db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{}) if err != nil { log.Fatal("open:", err) } var before int64 db.Raw(`SELECT COUNT(*) FROM brand_runway WHERE is_deleted=0 AND title_cn <> ''`).Scan(&before) fmt.Printf("before: title_cn 非空 = %d\n", before) if r := db.Exec(titleCnSQL); r.Error != nil { log.Fatalf("backfill title_cn failed: %v", r.Error) } else { fmt.Printf("updated rows = %d\n", r.RowsAffected) } var after int64 db.Raw(`SELECT COUNT(*) FROM brand_runway WHERE is_deleted=0 AND title_cn <> ''`).Scan(&after) fmt.Printf("after: title_cn 非空 = %d\n", after) // 抽样核对:原始 title -> 生成 title_cn type row struct { Title string TitleCn string } var rows []row db.Raw(`SELECT title, title_cn FROM brand_runway WHERE is_deleted=0 ORDER BY id LIMIT 12`).Scan(&rows) fmt.Println("samples:") for _, r := range rows { fmt.Printf(" %-32q -> %q\n", r.Title, r.TitleCn) } fmt.Println("title_cn backfill done.") }