46 lines
1.4 KiB
Go
46 lines
1.4 KiB
Go
// 数据库初始化工具:读取 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)
|
||
}
|