Files
workspace/code/base-project/base-go-v2/internal/db/db.go
T
2025-11-04 17:32:32 +08:00

66 lines
1.3 KiB
Go

package db
import (
"base-go-v2/internal/config"
"fmt"
"time"
"github.com/jmoiron/sqlx"
_ "github.com/lib/pq"
)
var DB *sqlx.DB
var defaultPoolConfig = struct {
MaxOpenConns int
MaxIdleConns int
ConnMaxLifetime time.Duration
}{
MaxOpenConns: 10,
MaxIdleConns: 5,
ConnMaxLifetime: 30 * time.Minute,
}
func InitDb() error {
d := config.App.Db
// 构造 DSN
dsn := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable",
d.Host, d.Port, d.User, d.Password, d.Dbname)
db, err := sqlx.Connect("postgres", dsn)
if err != nil {
return fmt.Errorf("打开数据库失败: %w", err)
}
// 设置连接池(使用默认值,如果用户没传)
maxOpenConns := d.MaxOpenConns
if maxOpenConns == 0 {
maxOpenConns = defaultPoolConfig.MaxOpenConns
}
db.SetMaxOpenConns(maxOpenConns)
maxIdleConns := d.MaxIdleConns
if maxIdleConns == 0 {
maxIdleConns = defaultPoolConfig.MaxIdleConns
}
db.SetMaxIdleConns(maxIdleConns)
connMaxLifetime := d.ConnMaxLifetime
if connMaxLifetime == 0 {
connMaxLifetime = defaultPoolConfig.ConnMaxLifetime
}
db.SetConnMaxLifetime(connMaxLifetime)
// 测试连接
if err := db.Ping(); err != nil {
return fmt.Errorf("数据库连接测试失败: %w", err)
}
fmt.Printf("✅ 数据库连接成功:%s:%d/%s\n", d.Host, d.Port, d.Dbname)
DB = db
return nil
}