Files

52 lines
1.2 KiB
Go

package db
import (
"EnGin/internal/global"
"database/sql"
"fmt"
"time"
"EnGin/internal/ent"
entsql "entgo.io/ent/dialect/sql"
_ "github.com/go-sql-driver/mysql" // MySQL 驱动
_ "github.com/lib/pq" // PostgreSQL 驱动
)
// Client 跨包调用的统一数据库客户端实例
var Client *ent.Client
// InitDB 根据配置初始化数据库连接
func InitDB(driver string, dsn string) error {
// 先创建标准 sql.DB 以配置连接池
db, err := sql.Open(driver, dsn)
if err != nil {
return fmt.Errorf("打开数据库连接失败 [%s]: %w", driver, err)
}
// 立即 Ping 数据库,验证账号密码及数据库是否存在
if err := db.Ping(); err != nil {
return fmt.Errorf("无法连接至数据库 [%s],请检查账号密码或数据库是否存在: %w", driver, err)
}
// 连接池设置
db.SetMaxIdleConns(10)
db.SetMaxOpenConns(100)
db.SetConnMaxLifetime(time.Hour)
// 将 sql.DB 包装为 ent 客户端
drv := entsql.OpenDB(driver, db)
Client = ent.NewClient(ent.Driver(drv))
global.Log.Info("数据库初始化成功")
return nil
}
// Close 关闭数据库连接
func Close() {
if Client != nil {
Client.Close()
}
}