// Applies init.sql to the local MySQL using the app's built-in default connection. package main import ( "database/sql" "fmt" "os" "strings" _ "github.com/go-sql-driver/mysql" ) func main() { if len(os.Args) > 1 && os.Args[1] == "inspect" { inspect() return } raw, err := os.ReadFile("init.sql") if err != nil { panic(err) } db, err := sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/?multiStatements=false&charset=utf8mb4") if err != nil { panic(err) } defer db.Close() // init.sql 的升级段依赖会话变量(SET @sql / PREPARE),必须固定在同一连接上执行。 db.SetMaxOpenConns(1) var kept []string for _, line := range strings.Split(string(raw), "\n") { if t := strings.TrimSpace(line); strings.HasPrefix(t, "--") { continue } kept = append(kept, line) } for _, stmt := range strings.Split(strings.Join(kept, "\n"), ";") { s := strings.TrimSpace(stmt) if s == "" { continue } if _, err := db.Exec(s); err != nil { fmt.Println("ERR:", err, "stmt:", s[:min(80, len(s))]) os.Exit(1) } } var n int if err := db.QueryRow("SELECT COUNT(*) FROM code_count.sync_settings").Scan(&n); err != nil { fmt.Println("verify failed:", err) os.Exit(1) } fmt.Println("ok, sync_settings rows:", n) } func min(a, b int) int { if a < b { return a } return b } func inspect() { db, err := sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/code_count?charset=utf8mb4") if err != nil { panic(err) } defer db.Close() rows, err := db.Query("SELECT user_id, name, LENGTH(value), updated_at FROM sync_settings ORDER BY user_id, name") if err != nil { panic(err) } defer rows.Close() for rows.Next() { var uid int64 var name, at string var n int if err := rows.Scan(&uid, &name, &n, &at); err != nil { panic(err) } fmt.Printf("user=%d name=%-12s bytes=%-6d at=%s\n", uid, name, n, at) } }