package database import ( "database/sql" "fmt" "time" "backend/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() }