# Guía: Crear Base de Datos Gamilit **Fecha**: 2025-11-08 **Versión**: 1.0 **Estado**: ✅ Listo para usar --- ## Descripción Este directorio contiene todos los archivos DDL (Data Definition Language) necesarios para crear la base de datos completa de Gamilit desde cero. --- ## Estructura de Archivos ``` apps/database/ ├── create-database.sh ← Script maestro de creación ├── 00-prerequisites.sql ← Schemas y ENUMs base ├── ddl/ │ └── schemas/ │ ├── auth/ ← Autenticación Supabase │ ├── auth_management/ ← Gestión de usuarios │ ├── educational_content/← Contenido educativo │ ├── gamification_system/← Sistema de gamificación │ ├── progress_tracking/ ← Seguimiento de progreso │ ├── social_features/ ← Características sociales │ ├── content_management/ ← Gestión de contenido │ ├── audit_logging/ ← Auditoría y logs │ ├── system_configuration/← Configuración │ ├── admin_dashboard/ ← Dashboard administrativo │ ├── gamilit/ ← Funciones compartidas │ └── storage/ ← Storage Supabase └── migrations/ ← Migraciones de BD ``` --- ## Requisitos Previos ### 1. PostgreSQL 14 o superior ```bash # Verificar versión instalada psql --version ``` ### 2. Base de datos creada ```bash # Opción A: Crear base de datos local createdb gamilit # Opción B: Usar Supabase # (crear proyecto en https://supabase.com) ``` ### 3. Variable DATABASE_URL configurada ```bash # Formato para PostgreSQL local export DATABASE_URL="postgresql://usuario:password@localhost:5432/gamilit" # Formato para Supabase export DATABASE_URL="postgresql://postgres:[YOUR-PASSWORD]@db.[YOUR-PROJECT-REF].supabase.co:5432/postgres" ``` --- ## Método 1: Script Automático (Recomendado) ### Opción A: Usando variable de entorno ```bash # 1. Configurar DATABASE_URL export DATABASE_URL="postgresql://usuario:password@localhost:5432/gamilit" # 2. Ejecutar script cd apps/database ./create-database.sh ``` ### Opción B: Pasando URL como argumento ```bash cd apps/database ./create-database.sh "postgresql://usuario:password@localhost:5432/gamilit" ``` ### Salida Esperada ``` ============================================================================ INICIO: Creación de Base de Datos Gamilit ============================================================================ DATABASE_URL: postgresql://localhost:5432/gamilit DDL_DIR: /path/to/ddl LOG_FILE: /path/to/create-database-20251108_143022.log ✅ Conexión exitosa a la base de datos ============================================================================ FASE 1: PREREQUISITES - Schemas y ENUMs ============================================================================ ✅ Completado: Crear schemas y ENUMs base ✅ FASE 1 completada ============================================================================ FASE 2: FUNCIONES COMPARTIDAS ============================================================================ ✅ Completado: Funciones compartidas (gamilit schema) (13 archivos) ✅ FASE 2 completada ... (continúa con todas las fases) ============================================================================ RESUMEN FINAL ============================================================================ Objetos creados: - Schemas: 13 - Tablas: 63 - ENUMs: 35 - Funciones: 80 - Triggers: 45 ✅ BASE DE DATOS CREADA EXITOSAMENTE ============================================================================ Log completo disponible en: create-database-20251108_143022.log ``` --- ## Método 2: Paso a Paso Manual ### 1. Ejecutar prerequisites ```bash psql "$DATABASE_URL" -f ddl/00-prerequisites.sql ``` ### 2. Ejecutar esquemas en orden ```bash # Funciones compartidas psql "$DATABASE_URL" -f ddl/schemas/gamilit/functions/*.sql # Auth (Supabase) psql "$DATABASE_URL" -f ddl/schemas/auth/enums/*.sql psql "$DATABASE_URL" -f ddl/schemas/auth/tables/*.sql # Auth Management psql "$DATABASE_URL" -f ddl/schemas/auth_management/tables/*.sql psql "$DATABASE_URL" -f ddl/schemas/auth_management/triggers/*.sql psql "$DATABASE_URL" -f ddl/schemas/auth_management/rls-policies/*.sql # Educational Content psql "$DATABASE_URL" -f ddl/schemas/educational_content/tables/*.sql psql "$DATABASE_URL" -f ddl/schemas/educational_content/functions/*.sql psql "$DATABASE_URL" -f ddl/schemas/educational_content/triggers/*.sql # ... (continuar con otros schemas) ``` --- ## Método 3: Aplicar Migraciones (Base de Datos Existente) Si ya tienes una base de datos con el schema `public` legacy y quieres migrar a la nueva arquitectura: ### 1. Migrar ENUMs de public a schemas correctos ```bash cd migrations # P1: Alta Prioridad psql "$DATABASE_URL" -f 2025-11-08-migrate-auth-provider-enum.sql psql "$DATABASE_URL" -f 2025-11-08-migrate-notification-enums.sql # P2: Media Prioridad psql "$DATABASE_URL" -f 2025-11-08-migrate-difficulty-level-enum.sql psql "$DATABASE_URL" -f 2025-11-08-migrate-content-management-enums.sql psql "$DATABASE_URL" -f 2025-11-08-migrate-setting-type-enum.sql # P3: Baja Prioridad (si aplica) # ... migraciones adicionales ``` ### 2. Aplicar otras migraciones ```bash psql "$DATABASE_URL" -f 2025-11-08-add-fk-profiles-school.sql ``` --- ## Orden de Ejecución (Fases) El script `create-database.sh` ejecuta los archivos DDL en este orden: | Fase | Schema | Componentes | Archivos | |------|--------|-------------|----------| | 1 | prerequisites | Schemas + ENUMs | 1 | | 2 | gamilit | Funciones comunes | ~13 | | 3 | auth | Tables + Enums | ~5 | | 4 | storage | Enums | ~1 | | 5 | auth_management | Tables + Functions + Triggers + RLS | ~25 | | 6 | educational_content | Tables + Functions + Triggers + RLS | ~50 | | 7 | gamification_system | Tables + Functions + Triggers + Views + RLS | ~55 | | 8 | progress_tracking | Tables + Functions + Triggers + Views + RLS | ~25 | | 9 | social_features | Tables + Functions + Triggers + RLS | ~20 | | 10 | content_management | Tables + Triggers + RLS | ~10 | | 11 | audit_logging | Tables + Functions + Triggers + RLS | ~15 | | 12 | system_configuration | Tables + Triggers + RLS | ~3 | | 13 | admin_dashboard | Views | ~1 | **Total**: ~225 archivos DDL --- ## Verificación Post-Creación ### 1. Verificar schemas creados ```sql SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('pg_catalog', 'information_schema', 'pg_toast') ORDER BY schema_name; ``` **Resultado esperado**: 13 schemas ### 2. Verificar tablas creadas ```sql SELECT table_schema, COUNT(*) as table_count FROM information_schema.tables WHERE table_schema NOT IN ('pg_catalog', 'information_schema') GROUP BY table_schema ORDER BY table_schema; ``` **Resultado esperado**: ~63 tablas distribuidas en los schemas ### 3. Verificar ENUMs creados ```sql SELECT n.nspname as schema, t.typname as enum_name, COUNT(e.enumlabel) as value_count FROM pg_type t JOIN pg_namespace n ON t.typnamespace = n.oid LEFT JOIN pg_enum e ON t.oid = e.enumtypid WHERE t.typcategory = 'E' AND n.nspname NOT IN ('pg_catalog', 'information_schema') GROUP BY n.nspname, t.typname ORDER BY n.nspname, t.typname; ``` **Resultado esperado**: 35 ENUMs distribuidos en los schemas ### 4. Verificar funciones creadas ```sql SELECT n.nspname as schema, COUNT(*) as function_count FROM pg_proc p JOIN pg_namespace n ON p.pronamespace = n.oid WHERE n.nspname NOT IN ('pg_catalog', 'information_schema') GROUP BY n.nspname ORDER BY n.nspname; ``` **Resultado esperado**: ~80 funciones distribuidas en los schemas --- ## Troubleshooting ### Error: "psql: command not found" ```bash # Ubuntu/Debian sudo apt-get install postgresql-client # macOS brew install postgresql # Windows # Descargar desde https://www.postgresql.org/download/windows/ ``` ### Error: "connection refused" ```bash # Verificar que PostgreSQL esté corriendo sudo systemctl status postgresql # Linux brew services list # macOS # Verificar la URL de conexión echo $DATABASE_URL ``` ### Error: "permission denied" ```bash # Asegurarse de tener permisos de superusuario psql "$DATABASE_URL" -c "SELECT current_user, current_database();" # Si es necesario, conectarse como superusuario export DATABASE_URL="postgresql://postgres:password@localhost:5432/gamilit" ``` ### Error: "duplicate key value violates unique constraint" ```bash # La base de datos ya tiene datos # Opción 1: Borrar y recrear dropdb gamilit && createdb gamilit # Opción 2: Usar migraciones en lugar de create-database.sh cd migrations psql "$DATABASE_URL" -f [migration-file].sql ``` ### Error en fase específica ```bash # Revisar el log generado cat apps/database/create-database-YYYYMMDD_HHMMSS.log # Ejecutar manualmente la fase que falló psql "$DATABASE_URL" -f ddl/schemas/[schema]/[type]/[file].sql ``` --- ## Logs y Depuración ### Ubicación de logs Cada ejecución de `create-database.sh` genera un log con timestamp: ``` apps/database/create-database-20251108_143022.log ``` ### Contenido del log - Timestamp de cada operación - Archivos ejecutados - Errores de PostgreSQL - Warnings y notices - Resumen de objetos creados ### Ver log en tiempo real ```bash tail -f create-database-*.log ``` --- ## Siguientes Pasos Después de crear la base de datos: 1. **Verificar integridad**: Ejecutar queries de verificación 2. **Aplicar datos semilla** (si existen): `psql "$DATABASE_URL" -f seed-data.sql` 3. **Configurar backend**: Actualizar `.env` con DATABASE_URL 4. **Ejecutar migraciones**: Si hay migraciones pendientes 5. **Testing**: Ejecutar tests de integración del backend --- ## Scripts Relacionados - `create-database.sh` - Script maestro de creación - `migrations/*.sql` - Migraciones individuales - `seed-data.sql` - Datos iniciales (si existe) - `backup-database.sh` - Backup de base de datos (si existe) - `reset-database.sh` - Resetear base de datos (si existe) --- ## Documentación Adicional - `REPORTE-COMPLETITUD-DDL-2025-11-08.md` - Inventario completo de archivos DDL - `PLAN-MIGRACION-ENUMS-PUBLIC-SCHEMA.md` - Plan de migración de ENUMs - `REPORTE-MIGRACION-ENUMS-2025-11-08.md` - Reporte de migración de ENUMs - `docs/02-especificaciones-tecnicas/arquitectura-base-datos/` - Documentación técnica --- ## Contacto y Soporte Para problemas o preguntas: 1. Revisar este README y los logs 2. Consultar documentación en `docs/` 3. Crear issue en el repositorio del proyecto --- **Documento creado**: 2025-11-08 **Última actualización**: 2025-11-08 **Versión del script**: 1.0