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