// 数据库初始化工具:读取 sql/init.sql 并整体执行(建库建表+种子数据) // 使用方式:在 backend 目录下执行 go run ./tools/dbinit package main import ( "database/sql" "fmt" "os" _ "github.com/go-sql-driver/mysql" ) func main() { // 读取初始化 SQL 脚本(相对 backend 目录的上级 sql 目录) content, err := os.ReadFile("../sql/init.sql") if err != nil { fmt.Println("读取 sql/init.sql 失败:", err) os.Exit(1) } // 连接本地 MySQL(不指定库名,因为脚本内部会自行建库) // multiStatements=true 允许一次执行整个脚本 dsn := "root:root@tcp(127.0.0.1:3306)/?charset=utf8mb4&multiStatements=true" db, err := sql.Open("mysql", dsn) if err != nil { fmt.Println("连接 MySQL 失败:", err) os.Exit(1) } defer db.Close() if err := db.Ping(); err != nil { fmt.Println("MySQL 无法连通(请确认 3306 端口、账号 root/root):", err) os.Exit(1) } // 整体执行初始化脚本 if _, err := db.Exec(string(content)); err != nil { fmt.Println("执行初始化脚本失败:", err) os.Exit(1) } // 简单校验:统计游戏数量确认种子数据写入成功 var gameCount int if err := db.QueryRow("SELECT COUNT(*) FROM xiaoyouxi.games").Scan(&gameCount); err != nil { fmt.Println("校验失败:", err) os.Exit(1) } fmt.Printf("数据库初始化成功!games 表共 %d 款游戏\n", gameCount) }