51 lines
1.1 KiB
Go
51 lines
1.1 KiB
Go
package store
|
|
|
|
import (
|
|
"database/sql"
|
|
"fmt"
|
|
"time"
|
|
|
|
_ "github.com/go-sql-driver/mysql"
|
|
_ "modernc.org/sqlite"
|
|
|
|
"myaibot/internal/config"
|
|
)
|
|
|
|
func Open(cfg *config.DatabaseConfig) (*sql.DB, error) {
|
|
driver, dsn, err := resolve(cfg)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
db, err := sql.Open(driver, dsn)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("打开数据库失败: %w", err)
|
|
}
|
|
db.SetMaxOpenConns(10)
|
|
db.SetMaxIdleConns(5)
|
|
db.SetConnMaxLifetime(30 * time.Minute)
|
|
if err := db.Ping(); err != nil {
|
|
db.Close()
|
|
return nil, fmt.Errorf("数据库连接失败: %w", err)
|
|
}
|
|
return db, nil
|
|
}
|
|
|
|
func Close(db *sql.DB) {
|
|
if db != nil {
|
|
db.Close()
|
|
}
|
|
}
|
|
|
|
func resolve(cfg *config.DatabaseConfig) (driver, dsn string, err error) {
|
|
switch cfg.Driver {
|
|
case "sqlite3":
|
|
return "sqlite", cfg.File, nil
|
|
case "mysql":
|
|
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
|
|
cfg.User, cfg.Password, cfg.Host, cfg.Port, cfg.Name)
|
|
return "mysql", dsn, nil
|
|
default:
|
|
return "", "", fmt.Errorf("不支持的数据库驱动: %s", cfg.Driver)
|
|
}
|
|
}
|