65 lines
1.4 KiB
Go
65 lines
1.4 KiB
Go
// internal/database/postgresql.go
|
|
package database
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"time"
|
|
|
|
"go-server/internal/config"
|
|
|
|
"gorm.io/driver/postgres"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type PostgresConfig struct {
|
|
Host string
|
|
Port string
|
|
User string
|
|
Password string
|
|
DBName string
|
|
SSLMode string
|
|
}
|
|
|
|
func NewPostgresConfig() PostgresConfig {
|
|
cfg, err := config.LoadConfig()
|
|
if err != nil {
|
|
log.Fatalf("Failed to load postgres config: %v", err)
|
|
}
|
|
|
|
return PostgresConfig{
|
|
Host: cfg.Database.Host,
|
|
Port: cfg.Database.Port,
|
|
User: cfg.Database.User,
|
|
Password: cfg.Database.Password,
|
|
DBName: cfg.Database.Name,
|
|
SSLMode: cfg.Database.SSLMode,
|
|
}
|
|
}
|
|
|
|
func NewPostgresConnection(config PostgresConfig) (*gorm.DB, error) {
|
|
dsn := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%s sslmode=%s",
|
|
config.Host, config.User, config.Password, config.DBName, config.Port, config.SSLMode)
|
|
|
|
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{
|
|
PrepareStmt: true,
|
|
SkipDefaultTransaction: true,
|
|
// Logger can be enabled if needed for debugging
|
|
// Logger: logger.Default.LogMode(logger.Info),
|
|
})
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to connect to database: %w", err)
|
|
}
|
|
|
|
// Configure database/sql connection pool
|
|
sqlDB, err := db.DB()
|
|
if err == nil {
|
|
sqlDB.SetMaxIdleConns(10)
|
|
sqlDB.SetMaxOpenConns(50)
|
|
sqlDB.SetConnMaxLifetime(60 * time.Minute)
|
|
sqlDB.SetConnMaxIdleTime(10 * time.Minute)
|
|
}
|
|
|
|
return db, nil
|
|
}
|