database.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package database
  2. import (
  3. "fmt"
  4. "os"
  5. "time"
  6. "gorm.io/driver/mysql"
  7. "gorm.io/gorm"
  8. "gorm.io/gorm/logger"
  9. )
  10. var DB *gorm.DB
  11. // InitDB 初始化数据库连接
  12. func InitDB() error {
  13. var err error
  14. // 从环境变量获取 MySQL 连接信息
  15. dbHost := os.Getenv("DB_HOST")
  16. if dbHost == "" {
  17. dbHost = "localhost"
  18. }
  19. dbPort := os.Getenv("DB_PORT")
  20. if dbPort == "" {
  21. dbPort = "3306"
  22. }
  23. dbUser := os.Getenv("DB_USER")
  24. if dbUser == "" {
  25. dbUser = "root"
  26. }
  27. dbPassword := os.Getenv("DB_PASSWORD")
  28. if dbPassword == "" {
  29. dbPassword = "password"
  30. }
  31. dbName := os.Getenv("DB_NAME")
  32. if dbName == "" {
  33. dbName = "license_admin"
  34. }
  35. // 构建 DSN (Data Source Name)
  36. dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8mb4&parseTime=True&loc=Local",
  37. dbUser, dbPassword, dbHost, dbPort, dbName)
  38. // 配置 GORM
  39. config := &gorm.Config{
  40. Logger: logger.Default.LogMode(logger.Info),
  41. }
  42. // 连接数据库,如果数据库不存在会自动创建(需要用户有 CREATE DATABASE 权限)
  43. DB, err = gorm.Open(mysql.Open(dsn), config)
  44. if err != nil {
  45. return fmt.Errorf("连接数据库失败: %v", err)
  46. }
  47. // 获取底层 SQL 连接以设置连接池
  48. sqlDB, err := DB.DB()
  49. if err != nil {
  50. return fmt.Errorf("获取数据库连接失败: %v", err)
  51. }
  52. // 设置连接池参数
  53. sqlDB.SetMaxIdleConns(10) // 设置空闲连接池中连接的最大数量
  54. sqlDB.SetMaxOpenConns(100) // 设置打开数据库连接的最大数量
  55. sqlDB.SetConnMaxLifetime(time.Hour) // 设置连接可复用的最大时间
  56. // 测试数据库连接
  57. if err = sqlDB.Ping(); err != nil {
  58. return fmt.Errorf("数据库连接测试失败: %v", err)
  59. }
  60. return nil
  61. }