package database import ( "fmt" "gorm.io/driver/mysql" "gorm.io/driver/postgres" "gorm.io/driver/sqlite" "gorm.io/gorm" "gorm.io/gorm/logger" "log" "os" "time" ) type Config struct { Driver string `json:"driver"` // mysql, postgres, sqlite Host string `json:"host,optional"` Port int `json:"port,optional"` Username string `json:"username,optional"` Password string `json:"password,optional"` Database string `json:"database,optional"` Charset string `json:"charset,optional"` SSLMode string `json:"ssl_mode,optional"` FilePath string `json:"file_path,optional"` // for sqlite } func NewDB(config Config) (*gorm.DB, error) { var db *gorm.DB var err error // 配置日志 newLogger := logger.New( log.New(os.Stdout, "\r\n", log.LstdFlags), // io writer logger.Config{ SlowThreshold: time.Second, // 慢 SQL 阈值 LogLevel: logger.Silent, // 日志级别 Colorful: false, // 禁用彩色打印 }, ) switch config.Driver { case "mysql": dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=%s&parseTime=True&loc=Local", config.Username, config.Password, config.Host, config.Port, config.Database, config.Charset) db, err = gorm.Open(mysql.Open(dsn), &gorm.Config{ Logger: newLogger, }) case "postgres": dsn := fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%d sslmode=%s TimeZone=Asia/Shanghai", config.Host, config.Username, config.Password, config.Database, config.Port, config.SSLMode) db, err = gorm.Open(postgres.Open(dsn), &gorm.Config{ Logger: newLogger, }) case "sqlite": db, err = gorm.Open(sqlite.Open(config.FilePath), &gorm.Config{ Logger: newLogger, }) default: return nil, fmt.Errorf("unsupported database driver: %s", config.Driver) } if err != nil { return nil, err } // 设置连接池 sqlDB, err := db.DB() if err != nil { return nil, err } sqlDB.SetMaxIdleConns(10) sqlDB.SetMaxOpenConns(100) sqlDB.SetConnMaxLifetime(time.Hour) return db, nil }