Go 实现 /api/v1/analysis 契约、Demo/Live Worker、DeerFlow SSE;含设计文档与冒烟脚本。 Co-authored-by: Cursor <cursoragent@cursor.com>
48 lines
1.1 KiB
Go
48 lines
1.1 KiB
Go
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
|
|
}
|