54 lines
1.2 KiB
Go
54 lines
1.2 KiB
Go
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{},
|
||
)
|
||
}
|