165 lines
4.7 KiB
Go
165 lines
4.7 KiB
Go
|
|
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)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|