更新若干功能
This commit is contained in:
82
tools/applyinit/main.go
Normal file
82
tools/applyinit/main.go
Normal file
@@ -0,0 +1,82 @@
|
||||
// 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)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user