package postgres import ( "fmt" "time" "gorm.io/gorm" "gorm.io/driver/postgres" "photography-backend/internal/config" "photography-backend/internal/models" ) // Database 数据库连接 type Database struct { DB *gorm.DB } // NewDatabase 创建数据库连接 func NewDatabase(cfg *config.DatabaseConfig) (*Database, error) { dsn := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=%s", cfg.Host, cfg.Port, cfg.Username, cfg.Password, cfg.Database, cfg.SSLMode, ) db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{}) if err != nil { return nil, fmt.Errorf("failed to connect to database: %w", err) } // 获取底层sql.DB实例配置连接池 sqlDB, err := db.DB() if err != nil { return nil, fmt.Errorf("failed to get sql.DB instance: %w", err) } // 设置连接池参数 sqlDB.SetMaxOpenConns(cfg.MaxOpenConns) sqlDB.SetMaxIdleConns(cfg.MaxIdleConns) sqlDB.SetConnMaxLifetime(time.Duration(cfg.ConnMaxLifetime) * time.Second) // 测试连接 if err := sqlDB.Ping(); err != nil { return nil, fmt.Errorf("failed to ping database: %w", err) } return &Database{DB: db}, nil } // AutoMigrate 自动迁移数据库表结构 func (d *Database) AutoMigrate() error { return d.DB.AutoMigrate( &models.User{}, &models.Category{}, &models.Tag{}, &models.Photo{}, ) } // Close 关闭数据库连接 func (d *Database) Close() error { sqlDB, err := d.DB.DB() if err != nil { return err } return sqlDB.Close() } // Health 检查数据库健康状态 func (d *Database) Health() error { sqlDB, err := d.DB.DB() if err != nil { return err } return sqlDB.Ping() }