80 lines
1.6 KiB
Go
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()
|
|
}
|