This commit is contained in:
toom1996
2026-08-26 19:40:16 +08:00
parent 30c9f21da4
commit a6724265ad
14 changed files with 400 additions and 101 deletions

View File

@ -0,0 +1,75 @@
// 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.")
}