// Package database 数据库连接 package database import ( "database/sql" "fmt" "gorm.io/gorm" gormlgger "gorm.io/gorm/logger" "github.com/runningwater/gohub/pkg/config" ) // DB 数据库连接实例 var DB *gorm.DB var SQLDB *sql.DB func Connect(dbConfig gorm.Dialector, _logger gormlgger.Interface) { // 使用 gorm.Open 连接数据库 var err error DB, err = gorm.Open(dbConfig, &gorm.Config{ Logger: _logger, }) // 处理错误 if err != nil { fmt.Println("数据库连接失败", err.Error()) } // 获取底层的 sql.DB 实例 SQLDB, err = DB.DB() if err != nil { fmt.Println("数据库连接失败", err.Error()) } } func CurrentDatabase() string { return DB.Migrator().CurrentDatabase() } func DeleteAllTables() error { var err error switch config.Get("database.connection") { case "mysql": err = deleteMySQLTables() case "sqlite": err = deleteAllSQLiteTables() default: err = fmt.Errorf("不支持的数据库类型: %s", config.Get("database.connection")) } return err } func deleteMySQLTables() error { dbname := CurrentDatabase() var tables []string err := DB.Table("information_schema.tables"). Where("table_schema = ?", dbname). Pluck("table_name", &tables).Error if err != nil { return err } // 暂时关闭外键检测 DB.Exec("SET FOREIGN_KEY_CHECKS = 0;") // 删除所有表 for _, table := range tables { if err := DB.Migrator().DropTable(table); err != nil { return err } } // 重新启用外键检测 DB.Exec("SET FOREIGN_KEY_CHECKS = 1;") return nil } func deleteAllSQLiteTables() error { var tables []string err := DB.Raw("SELECT name FROM sqlite_master WHERE type='table'"). Pluck("name", &tables).Error if err != nil { return err } // 删除所有表 for _, table := range tables { if err := DB.Migrator().DropTable(table); err != nil { return err } } return nil } // TableName 获取表名 func TableName(obj any) string { stmt := &gorm.Statement{DB: DB} err := stmt.Parse(obj) if err != nil { return "" } return stmt.Schema.Table }