package utils_gorm import ( "database/sql" "fmt" "geo/internal/config" "log" "os" "time" "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" ) func DBConn(c *config.DB) (*gorm.DB, func()) { // 1. 先打开数据库连接 mysqlConn, err := sql.Open(c.Driver, c.Source) if err != nil { panic(fmt.Sprintf("sql.Open failed: %v", err)) } // 2. 测试连接是否真的可用(这一步很重要!) if err := mysqlConn.Ping(); err != nil { panic(fmt.Sprintf("数据库 Ping 失败: %v", err)) } // 3. 配置强制输出的 Logger newLogger := logger.New( log.New(os.Stdout, "\r\n", log.LstdFlags), // 输出到标准输出 logger.Config{ SlowThreshold: time.Millisecond, // 慢查询阈值设为 1ms,基本所有查询都会记录 LogLevel: logger.Info, // Info 级别会打印所有 SQL IgnoreRecordNotFoundError: false, // 打印记录未找到的错误 ParameterizedQueries: false, // 显示完整 SQL 参数 Colorful: true, // 彩色输出 }, ) // 4. 再用 gorm 包装,并强制使用自定义 Logger gormDB, err := gorm.Open( mysql.New(mysql.Config{Conn: mysqlConn}), &gorm.Config{ Logger: newLogger, // 强制使用这个 Logger }, ) if err != nil { panic(fmt.Sprintf("gorm.Open failed: %v", err)) } // 5. 全局开启 Debug 模式(最强制的方式) gormDB = gormDB.Debug() sqlDB, err := gormDB.DB() if err != nil { panic(fmt.Sprintf("get sql.DB failed: %v", err)) } // SetMaxIdleConns sets the maximum number of connections in the idle connection pool. sqlDB.SetMaxIdleConns(int(c.MaxIdle)) // SetMaxOpenConns sets the maximum number of open connections to the database. sqlDB.SetMaxOpenConns(int(c.MaxLifetime)) // SetConnMaxLifetime sets the maximum amount of time a connection may be reused. sqlDB.SetConnMaxLifetime(time.Hour) // 测试日志是否生效 gormDB.Exec("SELECT 1") // 这行会打印日志 return gormDB, func() { if mysqlConn != nil { fmt.Println("关闭 physicalGoodsDB") if err := mysqlConn.Close(); err != nil { fmt.Println("关闭 physicalGoodsDB 失败:", err) } } } }