iferr:=db.QueryRow(`SELECT spec_key FROM syb_orders WHERE syb_id='SYB-1'`).Scan(&key);err!=nil||key!="黑色, M"{
t.Fatalf("规格回填=%q err=%v",key,err)
}
varemptysql.NullString
iferr:=db.QueryRow(`SELECT spec_key FROM syb_orders WHERE syb_id='SYB-3'`).Scan(&empty);err!=nil||empty.Valid{
t.Fatalf("空规格必须保持 NULL: %+v err=%v",empty,err)
}
varsourcestring
iferr:=db.QueryRow(`SELECT source FROM shopee_products WHERE goods_id='SKELETON-1'`).Scan(&source);err!=nil||source!="syb"{
t.Fatalf("骨架来源=%q err=%v",source,err)
}
varmappingCountint
iferr:=db.QueryRow(`SELECT COUNT(*) FROM spec_mappings WHERE shopee_goods_id='REPORT-1' AND spec_key='黑色, M' AND pdd_goods_id='PDD-1'`).Scan(&mappingCount);err!=nil||mappingCount!=1{
mustExec(t,db,`UPDATE syb_orders SET spec_key=? WHERE syb_id='SYB-A'`,key)
}},
{"全部完成版本未记录",func(t*testing.T,db*sql.DB){
iferr:=migrateMySQLV3(db);err!=nil{
t.Fatal(err)
}
}},
}{
t.Run(tc.name,func(t*testing.T){
db:=openMySQLMigrationTestDB(t)
deferdb.Close()
cleanMySQLTestSchema(t,db)
defercleanMySQLTestSchema(t,db)
prepareMySQLV2(t,db)
now:="2026-08-10T03:00:00Z"
mustExec(t,db,`INSERT INTO syb_orders (syb_id,order_no,title,shopee_goods_id,product_spec,quantity,syb_data,created_at,updated_at) VALUES ('SYB-A','A','A','G-A','黑色,M',1,'{}',?,?),('SYB-B','B','B','G-B','白色,L',1,'{}',?,?)`,now,now,now,now)
tc.prepare(t,db)
iferr:=MigrateMySQL(db);err!=nil{
t.Fatalf("重跑失败: %v",err)
}
iferr:=MigrateMySQL(db);err!=nil{
t.Fatalf("再次重跑失败: %v",err)
}
varcountint
iferr:=db.QueryRow(`SELECT COUNT(*) FROM syb_orders WHERE spec_key IS NOT NULL`).Scan(&count);err!=nil||count!=2{
t.Fatalf("回填未收敛 count=%d err=%v",count,err)
}
})
}
}
funcTestMySQLMigrate_V3字段存在但约束缺失可收敛(t*testing.T){
db:=openMySQLMigrationTestDB(t)
deferdb.Close()
cleanMySQLTestSchema(t,db)
defercleanMySQLTestSchema(t,db)
prepareMySQLV2(t,db)
mustExec(t,db,`INSERT INTO shopee_products(goods_id,title,created_at,updated_at) VALUES ('EXISTING-1','存量商品','2026-08-10T00:00:00Z','2026-08-10T00:00:00Z')`)
mustExec(t,db,`INSERT INTO shopee_products(goods_id,title,source,created_at,updated_at) VALUES ('CHECK-1','检查','report','2026-08-10T00:00:00Z','2026-08-10T00:00:00Z')`)
if_,err:=db.Exec(`UPDATE shopee_products SET source='typo'`);err==nil{