package repo import ( "log" "strings" ) // 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 } log.Printf("schema 语句失败(已跳过): %v | sql=%.80s…", err, stmt) } } } 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 }