Files
backend_v2/scripts/backfill_title_cn/main.go
toom1996 a6724265ad update
2026-08-26 19:40:16 +08:00

76 lines
2.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 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.")
}