Proyecto de ejemplo que implementa un CRUD de producto
usando exclusivamente procedimientos almacenados en MySQL.
El ORM de Django no se usa para las operaciones CRUD, solo para tipado con un modelo managed=False
.
- Python 3.10+ (3.11 recomendado)
- MySQL 8.x
- Paquetes Python (ver
requirements.txt
)
python -m venv venv
# Windows: venv\Scripts\activate
# Linux/Mac: source venv/bin/activate
pip install -r requirements.txt
Opcional (si prefieres PyMySQL):
- Instala
PyMySQL
y, enbackend/__init__.py
, agrega:import pymysql pymysql.install_as_MySQLdb()
- Crea la base, la tabla y los procedimientos ejecutando
schema.sql
en tu MySQL (Workbench, CLI o similar). - Credenciales por defecto esperadas en
settings.py
:- DB:
tienda
- USER:
tu_usuario
- PASSWORD:
tu_password
- HOST:
127.0.0.1
- PORT:
3306
- DB:
python manage.py migrate # (no migrará la tabla 'producto' porque es managed=False, pero sí tablas de Django)
python manage.py runserver
GET /api/productos/
GET /api/productos/{id}/
POST /api/productos/
PUT /api/productos/{id}/
DELETE /api/productos/{id}/
Crear
POST http://127.0.0.1:8000/api/productos/
Content-Type: application/json
{
"nombre": "Teclado Mecánico",
"precio": 250000.00,
"stock": 10
}
Listar
GET http://127.0.0.1:8000/api/productos/
Detalle
GET http://127.0.0.1:8000/api/productos/1/
Actualizar
PUT http://127.0.0.1:8000/api/productos/1/
Content-Type: application/json
{
"nombre": "Teclado Mecánico RGB",
"precio": 280000.00,
"stock": 12
}
Eliminar
DELETE http://127.0.0.1:8000/api/productos/1/
- El modelo
Producto
tienemanaged=False
para no generar migraciones sobre la tabla existente. - La lógica de acceso a datos está en
productos/services.py
usandocursor.callproc
. - Considera usar
transaction.atomic()
donde requieras atomicidad explícita.