174 lines
4.2 KiB
Markdown
174 lines
4.2 KiB
Markdown
# Configuración de Base de Datos - VoxPopuli Microservices
|
|
|
|
## MySQL (API de Usuarios)
|
|
|
|
### Crear la base de datos:
|
|
|
|
```sql
|
|
CREATE DATABASE voxpopuli_users CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
|
|
|
USE voxpopuli_users;
|
|
|
|
CREATE TABLE usuarios (
|
|
user_id INT AUTO_INCREMENT PRIMARY KEY,
|
|
nombre VARCHAR(100) NOT NULL,
|
|
apellido VARCHAR(100) NOT NULL,
|
|
email VARCHAR(255) UNIQUE NOT NULL,
|
|
fecha_nacimiento DATETIME NOT NULL,
|
|
fecha_creacion DATETIME DEFAULT CURRENT_TIMESTAMP,
|
|
calificacion FLOAT DEFAULT 50.0,
|
|
numero_reportes INT DEFAULT 0,
|
|
url_foto_perfil VARCHAR(500),
|
|
biografia VARCHAR(1000),
|
|
INDEX idx_nombre (nombre),
|
|
INDEX idx_email (email),
|
|
INDEX idx_fecha_creacion (fecha_creacion)
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
|
```
|
|
|
|
### Configuración en .env:
|
|
|
|
```
|
|
MYSQL_URL=mysql+pymysql://usuario:contraseña@localhost:3306/voxpopuli_users
|
|
```
|
|
|
|
### Nota sobre SQLAlchemy:
|
|
|
|
El proyecto usa SQLAlchemy para mapeo objeto-relacional (ORM). Las tablas se crean automáticamente cuando se ejecuta el código si usas:
|
|
|
|
```python
|
|
from infrastructure.adapters.persistence.db import Base, engine
|
|
|
|
# Crear todas las tablas definidas en los modelos
|
|
Base.metadata.create_all(bind=engine)
|
|
```
|
|
|
|
## MongoDB (API de Reportes)
|
|
|
|
### Crear la base de datos y colección:
|
|
|
|
```javascript
|
|
use voxpopuli_reports
|
|
|
|
db.createCollection("reportes")
|
|
|
|
// Crear índices para mejor rendimiento
|
|
db.reportes.createIndex({ "id_usuario": 1 })
|
|
db.reportes.createIndex({ "id_reporte": 1 }, { unique: true })
|
|
db.reportes.createIndex({ "visibilidad": 1 })
|
|
db.reportes.createIndex({ "fecha_creacion": -1 })
|
|
db.reportes.createIndex({ "tipo_reporte": 1 })
|
|
```
|
|
|
|
### Configuración en .env:
|
|
|
|
```
|
|
MONGODB_URL=mongodb://localhost:27017
|
|
MONGODB_DB=voxpopuli_reports
|
|
```
|
|
|
|
### Estructura de documento en MongoDB:
|
|
|
|
```json
|
|
{
|
|
"_id": ObjectId("..."),
|
|
"id_reporte": "550e8400-e29b-41d4-a716-446655440000",
|
|
"id_usuario": 1,
|
|
"tipo_reporte": 1,
|
|
"descripcion": "Descripción del reporte",
|
|
"ubicacion": "Ubicación específica",
|
|
"visibilidad": 50.0,
|
|
"fecha_creacion": ISODate("2024-01-15T10:30:00Z")
|
|
}
|
|
```
|
|
|
|
## Variables de Entorno
|
|
|
|
Archivo `.env` requerido:
|
|
|
|
```env
|
|
# MySQL
|
|
MYSQL_URL=mysql+pymysql://user:password@localhost/voxpopuli_users
|
|
|
|
# MongoDB
|
|
MONGODB_URL=mongodb://localhost:27017
|
|
MONGODB_DB=voxpopuli_reports
|
|
|
|
# Server
|
|
HOST=0.0.0.0
|
|
LOG_LEVEL=info
|
|
```
|
|
|
|
## Inicializar Bases de Datos
|
|
|
|
### Opción 1: Automático (Recomendado)
|
|
|
|
Crear un script `init_db.py`:
|
|
|
|
```python
|
|
from infrastructure.adapters.persistence.db import Base, engine
|
|
from infrastructure.adapters.persistence.models import UserModel
|
|
|
|
# Crear todas las tablas de MySQL
|
|
Base.metadata.create_all(bind=engine)
|
|
|
|
# Para MongoDB, la colección se crea automáticamente
|
|
print("Bases de datos inicializadas correctamente")
|
|
```
|
|
|
|
Ejecutar:
|
|
```bash
|
|
python init_db.py
|
|
```
|
|
|
|
### Opción 2: Manual
|
|
|
|
1. Crear MySQL database y tabla (ver scripts arriba)
|
|
2. Crear MongoDB database y colección (ver scripts arriba)
|
|
|
|
## Verificar Conexiones
|
|
|
|
### MySQL:
|
|
```python
|
|
from infrastructure.adapters.persistence.db import SessionLocal
|
|
|
|
db = SessionLocal()
|
|
print(db.execute("SELECT 1"))
|
|
db.close()
|
|
```
|
|
|
|
### MongoDB:
|
|
```python
|
|
from infrastructure.adapters.persistence.mongodb import get_reports_collection
|
|
|
|
collection = get_reports_collection()
|
|
print(collection.find_one())
|
|
```
|
|
|
|
## Respaldo y Restauración
|
|
|
|
### MySQL:
|
|
```bash
|
|
# Respaldo
|
|
mysqldump -u user -p voxpopuli_users > backup.sql
|
|
|
|
# Restauración
|
|
mysql -u user -p voxpopuli_users < backup.sql
|
|
```
|
|
|
|
### MongoDB:
|
|
```bash
|
|
# Respaldo
|
|
mongodump --db voxpopuli_reports --out ./backup
|
|
|
|
# Restauración
|
|
mongorestore --db voxpopuli_reports ./backup/voxpopuli_reports
|
|
```
|
|
|
|
## Notas Importantes
|
|
|
|
1. **Contraseñas**: Nunca guardes contraseñas reales en el repositorio. Usa variables de entorno.
|
|
2. **Índices**: Los índices mejoran significativamente el rendimiento en consultas frecuentes.
|
|
3. **Conexiones**: Los pools de conexión están configurados en `db.py` y `mongodb.py`.
|
|
4. **Unicode**: MySQL está configurado con UTF-8 para soportar múltiples idiomas correctamente.
|