全库清理测试字样 · 为小程序提审清场 —— 波波 2026-09-25

义父令:「将带有测试字样的数据全部清理掉,小程序提审尽量用真实一些的模拟数据」。


一、为什么不是改 packages 就完事

上一轮我只清了 packages,那是孤例思维。这次全库扫 176 张表才发现,

游客一眼能看到的地方还留着一堆:

表原内容(举例)
merchants.name测试商户001号
service_itemsseed_hotel_标准 / 测试hotel服务
guide_articlestest_seed_story_001 / 测试游客001
order_items.item_name测试套餐002
orders.contact_name测试游客001
key_tasks测试福钥任务1-checkin
users.nickname冒烟测试员
kora_routes.name冈仁波齐转山 3 日顺时针(测试数据)

提审标准比"能用"严:任何一处「测试 / DEMO / seed_」都会被挑。


二、分类处置:先分清哪些能改

这是最关键的一步——不是扫到什么就改什么。

能改:纯展示文案

商户名、服务项、攻略 slug 与署名、转山线路名、福钥任务、工分任务、

用户昵称、订单商品名、订单联系人、求救消息、后台备注。

手法:用 数组 + row_number 循环取值替换成真实内容,

不为几百行手写几百段文案。

不改:功能性标识

改了会破坏业务,而且它们本来就不给游客看:

标识为什么不能改
users.openid / trial_openids.openid登录标识,改了用户登不上
redemption_codes.code_no券码本身,改了券就废
restaurant_tables.qr_token扫码标识,改了桌码失效
schema_migrations.filename迁移文件记录,属基础设施

不改:逐条核实的误报


三、两个判据坑(同类第二次,留痕)

1. 扫描模式假阳性

最初用 %test%,结果英文 latest / contest / prototype 全被当成测试字样,

guides.body_html 就是这么误报的。收紧为「test 必须是独立词或前后有分隔符」后,

命中从 36 处降到 30 处。

2. 清理条件与扫描条件不一致

098 清 order_items 时 WHERE 只写了 ILIKE '%测试%',

漏掉 41 条名为「seed_额外服务」的明细——扫描用的却是 %seed\_%。

⇒ 补 099 迁移。

教训:清理的 WHERE 要从扫描的模式原样复制,别凭印象重写。


四、执行与验证

按纪律先 staging 验(幂等重跑影响 0 行),再上 prod。

prod 最终全库扫描只剩 6 处,全部是上面刻意保留的:

52  users.openid              (登录标识)
42  trial_openids.openid      (体验白名单)
 8  restaurant_tables.qr_token(扫码标识)
 7  schema_migrations.filename(基础设施)
 1  guides.body_html          (误报·正常正文)
 1  system_settings.description(误报·字段名说明)

C端 三个公开接口实测「测试 / test / seed_ / DEMO / demo」各 0 次:

商品:冈仁波齐外转山·3天2晚经典线 2880.0
攻略:冈仁波齐转山完整指南 | 路线
推荐:冈仁波齐外转山·3天2晚 2880

五、迁移文件

文件内容
backend/sql/098_clean_test_wording.sql展示类测试字样全量替换(幂等)
backend/sql/099_clean_seed_item_name.sql补漏:订单明细 seed_ 前缀
scripts/scan_test_wording.py全库扫描脚本(转正,提审前可随时复查)

六、提审前建议再确认