init.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package models
  2. import (
  3. "fmt"
  4. "log"
  5. "os"
  6. "time"
  7. "gorm.io/driver/postgres"
  8. "gorm.io/gorm"
  9. )
  10. var DB *gorm.DB
  11. func InitDB() {
  12. dsn := os.Getenv("DB_DSN")
  13. if dsn == "" {
  14. // Fallback for local development if not in env
  15. dsn = "host=localhost user=ems password=ems_pass dbname=ems port=5433 sslmode=disable TimeZone=Asia/Shanghai"
  16. }
  17. var err error
  18. maxRetries := 30
  19. for i := 0; i < maxRetries; i++ {
  20. DB, err = gorm.Open(postgres.Open(dsn), &gorm.Config{})
  21. if err == nil {
  22. break
  23. }
  24. log.Printf("Failed to connect to database (attempt %d/%d): %v. Retrying in 2 seconds...", i+1, maxRetries, err)
  25. time.Sleep(2 * time.Second)
  26. }
  27. if err != nil {
  28. log.Fatal("Failed to connect to database after multiple attempts:", err)
  29. }
  30. // Set connection pool settings
  31. sqlDB, err := DB.DB()
  32. if err != nil {
  33. log.Fatal("Failed to get generic database object:", err)
  34. }
  35. // SetMaxIdleConns sets the maximum number of connections in the idle connection pool.
  36. sqlDB.SetMaxIdleConns(10)
  37. // SetMaxOpenConns sets the maximum number of open connections to the database.
  38. sqlDB.SetMaxOpenConns(100)
  39. // SetConnMaxLifetime sets the maximum amount of time a connection may be reused.
  40. sqlDB.SetConnMaxLifetime(time.Hour)
  41. fmt.Println("Database connected successfully")
  42. // NOTE: AutoMigrate is disabled in favor of SQL migrations (golang-migrate).
  43. // Please look into backend/db/migrations/ for schema changes.
  44. /*
  45. err = DB.AutoMigrate(
  46. &IntegrationSource{},
  47. &Device{},
  48. &SysLocation{},
  49. &AlarmLog{},
  50. &SysOperLog{},
  51. &InspectionLedger{},
  52. &User{},
  53. &SysRole{},
  54. &SysUserRole{},
  55. &SysConfig{},
  56. &SysMenu{},
  57. &SysRoleMenu{},
  58. &EquipmentCleaningFormulaTemplate{},
  59. &BackupLog{},
  60. &AlarmRule{},
  61. &AlarmRuleBinding{},
  62. &AIAnalysisReport{},
  63. )
  64. if err != nil {
  65. log.Fatal("Failed to migrate database:", err)
  66. }
  67. fmt.Println("Database migration completed")
  68. */
  69. // Initialize basic menu data
  70. // TODO: Consider moving this to SQL migration as well (e.g. 000005_seed_menus.up.sql)
  71. InitSysMenuData(DB)
  72. }