66 lines
1.3 KiB
Go
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
|
|
}
|