package db import ( "fmt" "time" "everypublish/server/internal/config" "everypublish/server/internal/models" gormmysql "gorm.io/driver/mysql" "gorm.io/gorm" "gorm.io/gorm/logger" ) // Connect 建立 MySQL 连接并 Ping(重试 10 次,适配容器冷启动) func Connect(cfg *config.Config) (*gorm.DB, error) { db, err := gorm.Open(gormmysql.Open(cfg.MySQLDSN), &gorm.Config{Logger: logger.Default.LogMode(logger.Warn)}) if err != nil { return nil, err } sqlDB, err := db.DB() if err != nil { return nil, err } sqlDB.SetMaxOpenConns(50) sqlDB.SetMaxIdleConns(10) sqlDB.SetConnMaxLifetime(time.Hour) for i := 0; i < 10; i++ { if err = sqlDB.Ping(); err == nil { return db, nil } time.Sleep(time.Second) } return nil, fmt.Errorf("mysql ping failed: %w", err) } // AutoMigrate 开发期建表;生产走 golang-migrate(db/migrations) func AutoMigrate(db *gorm.DB) error { return db.AutoMigrate( &models.User{}, &models.Workspace{}, &models.Member{}, &models.Account{}, &models.Material{}, &models.Task{}, &models.AgentDevice{}, &models.Challenge{}, &models.AuditLog{}, &models.Notification{}, &models.PairingCode{}, &models.TransferToken{}, ) }