feat: 迁移 Admin Repository 到 MySQL 8 (#79)

This commit is contained in:
chengma
2026-08-10 02:21:31 +08:00
parent 05793e48b3
commit 13cfced80d
29 changed files with 390 additions and 240 deletions
+10 -11
View File
@@ -163,15 +163,15 @@ type PddProductRow struct {
SkuCount int
}
// 规格数交给 SQLite 算,不要把整个 skus_json 读进 Go 再数——
// 规格数交给 MySQL 算,不要把整个 skus_json 读进 Go 再数——
// 列表页几十上百行,每行都反序列化一遍纯属浪费。
//
// json_valid 那层判断不能省:skus_json 万一存进了坏数据,
// json_array_length 会让**整条查询报错**,页面直接打不开。
// JSON_VALID 那层判断不能省:skus_json 万一存进了坏数据,
// JSON_LENGTH 会让**整条查询报错**,页面直接打不开。
const pddSkuCountExpr = `
CASE WHEN skus_json IS NULL OR skus_json = '' OR NOT json_valid(skus_json)
CASE WHEN skus_json IS NULL OR skus_json = '' OR NOT JSON_VALID(skus_json)
THEN -1
ELSE COALESCE(json_array_length(skus_json, '$.skus'), -1)
ELSE COALESCE(JSON_LENGTH(skus_json, '$.skus'), -1)
END`
// pddListFilter 统一生成 PDD 列表和总数查询的筛选条件。
@@ -181,7 +181,7 @@ func pddListFilter(keyword string, status model.CollectStatus) (string, []any) {
args := make([]any, 0, 3)
if keyword = strings.TrimSpace(keyword); keyword != "" {
pattern := "%" + escapeLike(keyword) + "%"
where += ` AND (goods_id LIKE ? ESCAPE '\' OR url LIKE ? ESCAPE '\')`
where += ` AND (goods_id LIKE ? ESCAPE '!' OR url LIKE ? ESCAPE '!')`
args = append(args, pattern, pattern)
}
if status != "" {
@@ -230,12 +230,11 @@ func ListPddProducts(q Execer, keyword string, status model.CollectStatus, limit
return list, total, nil
}
// escapeLike 把 LIKE 的三个特殊字符转义掉,配合 ESCAPE '\' 使用。
// 反斜杠必须第一个换,否则会把后面刚加的反斜杠又转义一遍。
// escapeLike 把 LIKE 的三个特殊字符转义掉,配合 ESCAPE '!' 使用。
func escapeLike(s string) string {
s = strings.ReplaceAll(s, `\`, `\\`)
s = strings.ReplaceAll(s, `%`, `\%`)
s = strings.ReplaceAll(s, `_`, `\_`)
s = strings.ReplaceAll(s, `!`, `!!`)
s = strings.ReplaceAll(s, `%`, `!%`)
s = strings.ReplaceAll(s, `_`, `!_`)
return s
}