95 lines
1.8 KiB
Go
95 lines
1.8 KiB
Go
package database
|
||
|
||
import (
|
||
"fmt"
|
||
"log"
|
||
"time"
|
||
|
||
"gorm.io/driver/postgres"
|
||
"gorm.io/gorm"
|
||
"gorm.io/gorm/logger"
|
||
)
|
||
|
||
var DB *gorm.DB
|
||
|
||
// Config 数据库配置
|
||
type Config struct {
|
||
Host string
|
||
Port int
|
||
User string
|
||
Password string
|
||
DBName string
|
||
SSLMode string
|
||
TimeZone string
|
||
}
|
||
|
||
// Init 初始化数据库连接
|
||
func Init(config Config) error {
|
||
dsn := fmt.Sprintf(
|
||
"host=%s user=%s password=%s dbname=%s port=%d sslmode=%s TimeZone=%s",
|
||
config.Host,
|
||
config.User,
|
||
config.Password,
|
||
config.DBName,
|
||
config.Port,
|
||
config.SSLMode,
|
||
config.TimeZone,
|
||
)
|
||
|
||
var err error
|
||
DB, err = gorm.Open(postgres.Open(dsn), &gorm.Config{
|
||
Logger: logger.Default.LogMode(logger.Info), // 开发环境使用Info,生产环境使用Error
|
||
NowFunc: func() time.Time {
|
||
return time.Now().UTC()
|
||
},
|
||
})
|
||
|
||
if err != nil {
|
||
return fmt.Errorf("failed to connect to database: %w", err)
|
||
}
|
||
|
||
// 配置连接池
|
||
sqlDB, err := DB.DB()
|
||
if err != nil {
|
||
return fmt.Errorf("failed to get sql.DB: %w", err)
|
||
}
|
||
|
||
// 设置连接池参数
|
||
sqlDB.SetMaxIdleConns(10) // 最大空闲连接数
|
||
sqlDB.SetMaxOpenConns(100) // 最大打开连接数
|
||
sqlDB.SetConnMaxLifetime(time.Hour) // 连接最大生存时间
|
||
sqlDB.SetConnMaxIdleTime(10 * time.Minute) // 空闲连接最大生存时间
|
||
|
||
log.Println("Database connected successfully")
|
||
return nil
|
||
}
|
||
|
||
// Close 关闭数据库连接
|
||
func Close() error {
|
||
if DB != nil {
|
||
sqlDB, err := DB.DB()
|
||
if err != nil {
|
||
return err
|
||
}
|
||
return sqlDB.Close()
|
||
}
|
||
return nil
|
||
}
|
||
|
||
// GetDB 获取数据库实例
|
||
func GetDB() *gorm.DB {
|
||
return DB
|
||
}
|
||
|
||
// HealthCheck 健康检查
|
||
func HealthCheck() error {
|
||
if DB == nil {
|
||
return fmt.Errorf("database is not initialized")
|
||
}
|
||
sqlDB, err := DB.DB()
|
||
if err != nil {
|
||
return err
|
||
}
|
||
return sqlDB.Ping()
|
||
}
|