package data import ( "time" "kra/internal/conf" "github.com/go-kratos/kratos/v2/log" "gorm.io/driver/mysql" "gorm.io/driver/postgres" "gorm.io/driver/sqlite" "gorm.io/gorm" "gorm.io/gorm/logger" "gorm.io/gorm/schema" ) // NewGormDB 创建GORM数据库连接 func NewGormDB(c *conf.Data, l log.Logger) (*gorm.DB, func(), error) { helper := log.NewHelper(l) var dialector gorm.Dialector switch c.Database.Driver { case "mysql": dialector = mysql.Open(c.Database.Source) case "postgres": dialector = postgres.Open(c.Database.Source) case "sqlite": dialector = sqlite.Open(c.Database.Source) default: dialector = mysql.Open(c.Database.Source) } gormConfig := &gorm.Config{ NamingStrategy: schema.NamingStrategy{ TablePrefix: c.Database.TablePrefix, SingularTable: true, }, DisableForeignKeyConstraintWhenMigrating: true, } // 设置日志级别 if c.Database.LogMode { gormConfig.Logger = logger.Default.LogMode(logger.Info) } else { gormConfig.Logger = logger.Default.LogMode(logger.Silent) } db, err := gorm.Open(dialector, gormConfig) if err != nil { helper.Errorf("failed to connect database: %v", err) return nil, nil, err } sqlDB, err := db.DB() if err != nil { helper.Errorf("failed to get sql.DB: %v", err) return nil, nil, err } // 连接池配置 sqlDB.SetMaxIdleConns(int(c.Database.MaxIdleConns)) sqlDB.SetMaxOpenConns(int(c.Database.MaxOpenConns)) sqlDB.SetConnMaxLifetime(time.Duration(c.Database.MaxLifetime) * time.Second) cleanup := func() { helper.Info("closing database connection") if err := sqlDB.Close(); err != nil { helper.Errorf("failed to close database: %v", err) } } helper.Info("database connected successfully") return db, cleanup, nil }