Files
nl-blogs/server/scripts/verify_db.go
2026-01-15 13:51:44 +08:00

165 lines
4.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package main
import (
"database/sql"
"fmt"
"log"
_ "github.com/go-sql-driver/mysql"
)
func main() {
// MySQL连接信息
username := "root"
password := "root"
hostname := "127.0.0.1"
port := "3306"
// 构建DSN (Data Source Name) - 首先连接到MySQL服务器不指定数据库
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/", username, password, hostname, port)
// 连接到MySQL服务器
db, err := sql.Open("mysql", dsn)
if err != nil {
log.Fatalf("Failed to open database connection: %v", err)
}
defer db.Close()
// 测试连接
if err := db.Ping(); err != nil {
log.Fatalf("Failed to ping database: %v", err)
}
fmt.Println("Connected to MySQL server successfully!")
// 1. 检查数据库是否存在
var dbExists bool
checkDBQuery := "SELECT COUNT(*) > 0 FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = 'nl_blog'"
err = db.QueryRow(checkDBQuery).Scan(&dbExists)
if err != nil {
log.Fatalf("Failed to check database existence: %v", err)
}
if dbExists {
fmt.Println("✅ Database 'nl_blog' exists!")
} else {
log.Fatalf("❌ Database 'nl_blog' does not exist!")
}
// 2. 连接到nl_blog数据库
dsnWithDB := fmt.Sprintf("%s:%s@tcp(%s:%s)/nl_blog", username, password, hostname, port)
db, err = sql.Open("mysql", dsnWithDB)
if err != nil {
log.Fatalf("Failed to open database connection to nl_blog: %v", err)
}
defer db.Close()
if err := db.Ping(); err != nil {
log.Fatalf("Failed to ping nl_blog database: %v", err)
}
fmt.Println("Connected to 'nl_blog' database successfully!")
// 3. 查询数据库中的所有表
showTablesQuery := "SHOW TABLES"
rows, err := db.Query(showTablesQuery)
if err != nil {
log.Fatalf("Failed to show tables: %v", err)
}
defer rows.Close()
fmt.Println("\nTables in 'nl_blog' database:")
var tableName string
tableCount := 0
for rows.Next() {
if err := rows.Scan(&tableName); err != nil {
log.Fatalf("Failed to scan table name: %v", err)
}
fmt.Printf("✅ %s\n", tableName)
tableCount++
}
if tableCount == 0 {
log.Fatalf("❌ No tables found in 'nl_blog' database!")
} else {
fmt.Printf("\nTotal tables: %d\n", tableCount)
}
// 4. 检查主要表的结构和数据
checkTableStructure(db, "works")
checkTableStructure(db, "posts")
checkTableStructure(db, "snippets")
checkTableStructure(db, "users")
checkTableStructure(db, "settings")
fmt.Println("\n✅ Database verification completed successfully!")
}
// 检查表结构和数据
func checkTableStructure(db *sql.DB, tableName string) {
fmt.Printf("\n--- Checking table: %s ---", tableName)
// 检查表是否存在
var tableExists bool
checkTableQuery := "SELECT COUNT(*) > 0 FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'nl_blog' AND TABLE_NAME = ?"
err := db.QueryRow(checkTableQuery, tableName).Scan(&tableExists)
if err != nil {
log.Fatalf("Failed to check table existence: %v", err)
}
if !tableExists {
log.Fatalf("❌ Table '%s' does not exist!", tableName)
}
// 查询表中的记录数量
var count int
countQuery := fmt.Sprintf("SELECT COUNT(*) FROM %s", tableName)
err = db.QueryRow(countQuery).Scan(&count)
if err != nil {
log.Fatalf("Failed to count rows in table '%s': %v", tableName, err)
}
fmt.Printf("\n✅ Table '%s' exists with %d records", tableName, count)
// 查询表结构前5个字段
// 简化查询,只获取字段名、类型、是否为空和键信息,不获取默认值和额外信息
schemaQuery := `SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_KEY
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'nl_blog' AND TABLE_NAME = ?
ORDER BY ORDINAL_POSITION
LIMIT 5`
rows, err := db.Query(schemaQuery, tableName)
if err != nil {
log.Fatalf("Failed to get schema for table '%s': %v", tableName, err)
}
defer rows.Close()
fmt.Println("\nTable structure (top 5 fields):")
var field, fieldType, null, key string
for rows.Next() {
if err := rows.Scan(&field, &fieldType, &null, &key); err != nil {
log.Fatalf("Failed to scan field: %v", err)
}
fmt.Printf(" %s | %s | %s | %s\n", field, fieldType, null, key)
}
// 如果是posts表查询前2条记录
if tableName == "posts" && count > 0 {
fmt.Println("\nSample data (top 2 records):")
sampleQuery := "SELECT id, title, category, date FROM posts ORDER BY date DESC LIMIT 2"
rows, err := db.Query(sampleQuery)
if err != nil {
log.Fatalf("Failed to get sample data from '%s': %v", tableName, err)
}
defer rows.Close()
var id, title, category, date string
for rows.Next() {
if err := rows.Scan(&id, &title, &category, &date); err != nil {
log.Fatalf("Failed to scan sample data: %v", err)
}
fmt.Printf(" ID: %s | Title: %s | Category: %s | Date: %s\n", id, title, category, date)
}
}
}