geoGo/utils/utils_gorm/gorm.go

80 lines
2.2 KiB
Go
Raw Permalink 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 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)
}
}
}
}