Files

70 lines
1.5 KiB
Go

package storage
import (
"fmt"
"log"
"os"
"time"
"goalfymax-admin/internal/config"
"goalfymax-admin/pkg/utils"
"gorm.io/driver/postgres"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
var PG *gorm.DB
// InitPostgres 初始化PostgreSQL连接
func InitPostgres(appLogger *utils.Logger) error {
cfg := config.GetConfig()
pg := cfg.PostgreSQL
// 兼容 DSN 或字段拼接
dsn := pg.DSN
if dsn == "" {
ssl := pg.SSLMode
if ssl == "" {
ssl = "disable"
}
dsn = fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=%s TimeZone=UTC",
pg.Host, pg.Port, pg.User, pg.Password, pg.DBName, ssl,
)
}
lw := log.New(os.Stdout, "", log.LstdFlags)
gormLogger := logger.New(lw, logger.Config{
SlowThreshold: 200 * time.Millisecond,
LogLevel: logger.Info,
IgnoreRecordNotFoundError: true,
ParameterizedQueries: true,
Colorful: false,
})
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{Logger: gormLogger})
if err != nil {
return fmt.Errorf("连接PostgreSQL失败: %w", err)
}
sqlDB, err := db.DB()
if err != nil {
return fmt.Errorf("获取PostgreSQL实例失败: %w", err)
}
if pg.MaxOpenConns > 0 {
sqlDB.SetMaxOpenConns(pg.MaxOpenConns)
}
if pg.MaxIdleConns > 0 {
sqlDB.SetMaxIdleConns(pg.MaxIdleConns)
}
if pg.ConnMaxLifetime > 0 {
sqlDB.SetConnMaxLifetime(pg.ConnMaxLifetime)
}
if pg.ConnMaxIdleTime > 0 {
sqlDB.SetConnMaxIdleTime(pg.ConnMaxIdleTime)
}
PG = db
return nil
}
func GetPG() *gorm.DB { return PG }