update
This commit is contained in:
75
scripts/backfill_title_cn/main.go
Normal file
75
scripts/backfill_title_cn/main.go
Normal 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.")
|
||||
}
|
||||
Reference in New Issue
Block a user