Files

80 lines
1.6 KiB
Go

package database
import (
"database/sql"
"fmt"
"time"
"shared/pkg/logger"
_ "github.com/lib/pq"
)
type PostgresConfig struct {
Host string
Port int
User string
Password string
DBName string
SSLMode string
}
type PostgresDB struct {
DB *sql.DB
}
// NewPostgresDB 创建新的 PostgreSQL 数据库连接
func NewPostgresDB(config PostgresConfig) (*PostgresDB, error) {
connStr := fmt.Sprintf(
"host=%s port=%d user=%s password=%s dbname=%s sslmode=%s",
config.Host, config.Port, config.User, config.Password, config.DBName, config.SSLMode,
)
db, err := sql.Open("postgres", connStr)
if err != nil {
return nil, err
}
// 设置连接池参数
db.SetMaxOpenConns(25)
db.SetMaxIdleConns(5)
db.SetConnMaxLifetime(5 * time.Minute)
// 测试连接
if err := db.Ping(); err != nil {
return nil, err
}
logger.Info("Connected to PostgreSQL database")
return &PostgresDB{DB: db}, nil
}
// Close 关闭数据库连接
func (p *PostgresDB) Close() error {
if p.DB != nil {
return p.DB.Close()
}
return nil
}
// Exec 执行 SQL 语句
func (p *PostgresDB) Exec(query string, args ...interface{}) (sql.Result, error) {
return p.DB.Exec(query, args...)
}
// Query 执行查询
func (p *PostgresDB) Query(query string, args ...interface{}) (*sql.Rows, error) {
return p.DB.Query(query, args...)
}
// QueryRow 执行单行查询
func (p *PostgresDB) QueryRow(query string, args ...interface{}) *sql.Row {
return p.DB.QueryRow(query, args...)
}
// Begin 开始事务
func (p *PostgresDB) Begin() (*sql.Tx, error) {
return p.DB.Begin()
}