70 lines
1.5 KiB
Go
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 }
|