Files
gozerosandCursor bd427b57a1 feat: 换到 Gin 主流栈并补齐运维能力
HTTP 用 Gin,配置用 Viper,日志用 zap,数据用 sqlx;保留原有接口与会商行为。
顺带补上就绪探活、请求号、滚动日志、systemd 与 Dockerfile。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-11-04 09:51:41 +08:00

56 lines
1.3 KiB
Go

package repo
import (
"strings"
"git.gozeros.com/wsk/eightbf-analysis-go/internal/logging"
)
// ApplySchema 按语句拆开执行;重复索引等可忽略错误不阻断启动。
func (r *JobRepo) ApplySchema(schemaSQL string) {
for _, stmt := range splitSQL(schemaSQL) {
if _, err := r.DB.Exec(stmt); err != nil {
msg := err.Error()
// 1061 Duplicate key name / 已存在表
if strings.Contains(msg, "1061") || strings.Contains(msg, "1050") ||
strings.Contains(msg, "already exists") {
continue
}
logging.L.Warnw("schema 语句失败(已跳过)", "err", err, "sql", trunc(stmt, 80))
}
}
}
func trunc(s string, n int) string {
if len(s) <= n {
return s
}
return s[:n] + "…"
}
func splitSQL(s string) []string {
var out []string
var b strings.Builder
lines := strings.Split(s, "\n")
for _, line := range lines {
trim := strings.TrimSpace(line)
if trim == "" || strings.HasPrefix(trim, "--") {
continue
}
b.WriteString(line)
b.WriteByte('\n')
if strings.HasSuffix(trim, ";") {
stmt := strings.TrimSpace(b.String())
stmt = strings.TrimSuffix(stmt, ";")
if stmt != "" {
out = append(out, stmt)
}
b.Reset()
}
}
if rest := strings.TrimSpace(b.String()); rest != "" {
out = append(out, rest)
}
return out
}