package model import ( "fmt" "log" "os" "time" "gorm.io/driver/postgres" "gorm.io/driver/sqlite" "gorm.io/gorm" "gorm.io/gorm/logger" "carrot_bbs/internal/config" ) // DB 全局数据库连接 var DB *gorm.DB // InitDB 初始化数据库连接 func InitDB(cfg *config.DatabaseConfig) error { var err error var db *gorm.DB gormLogger := logger.New( log.New(os.Stdout, "\r\n", log.LstdFlags), logger.Config{ SlowThreshold: time.Duration(cfg.SlowThresholdMs) * time.Millisecond, LogLevel: parseGormLogLevel(cfg.LogLevel), IgnoreRecordNotFoundError: cfg.IgnoreRecordNotFound, ParameterizedQueries: cfg.ParameterizedQueries, Colorful: false, }, ) // 根据数据库类型选择驱动 switch cfg.Type { case "sqlite": db, err = gorm.Open(sqlite.Open(cfg.SQLite.Path), &gorm.Config{ Logger: gormLogger, }) case "postgres", "postgresql": dsn := cfg.Postgres.DSN() db, err = gorm.Open(postgres.Open(dsn), &gorm.Config{ Logger: gormLogger, }) default: // 默认使用PostgreSQL dsn := cfg.Postgres.DSN() db, err = gorm.Open(postgres.Open(dsn), &gorm.Config{ Logger: gormLogger, }) } if err != nil { return fmt.Errorf("failed to connect to database: %w", err) } DB = db // 配置连接池(SQLite不支持连接池配置,跳过) if cfg.Type != "sqlite" { sqlDB, err := DB.DB() if err != nil { return fmt.Errorf("failed to get database instance: %w", err) } sqlDB.SetMaxIdleConns(cfg.MaxIdleConns) sqlDB.SetMaxOpenConns(cfg.MaxOpenConns) } // 自动迁移 if err := autoMigrate(DB); err != nil { return fmt.Errorf("failed to auto migrate: %w", err) } log.Printf("Database connected (%s) and migrated successfully", cfg.Type) return nil } func parseGormLogLevel(level string) logger.LogLevel { switch level { case "silent": return logger.Silent case "error": return logger.Error case "warn": return logger.Warn case "info": return logger.Info default: return logger.Warn } } // autoMigrate 自动迁移数据库表 func autoMigrate(db *gorm.DB) error { err := db.AutoMigrate( // 用户相关 &User{}, // 帖子相关 &Post{}, &PostImage{}, // 评论相关 &Comment{}, &CommentLike{}, // 消息相关(使用雪花算法ID和seq机制) // 已读位置存储在 ConversationParticipant.LastReadSeq 中 &Conversation{}, &ConversationParticipant{}, &Message{}, // 系统通知(独立表,每个用户只能看到自己的通知) &SystemNotification{}, // 通知 &Notification{}, // 推送中心相关 &PushRecord{}, // 推送记录 &DeviceToken{}, // 设备Token // 社交 &Follow{}, &UserBlock{}, &PostLike{}, &Favorite{}, // 投票 &VoteOption{}, &UserVote{}, // 敏感词和审核 &SensitiveWord{}, &AuditLog{}, // 群组相关 &Group{}, &GroupMember{}, &GroupAnnouncement{}, &GroupJoinRequest{}, // 自定义表情 &UserSticker{}, ) if err != nil { return err } return nil } // CloseDB 关闭数据库连接 func CloseDB() { if sqlDB, err := DB.DB(); err == nil { sqlDB.Close() } }