| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- // 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
- }
|