Django: OperationalError: no such table
Cómo resolver 'no such table' en Django. Las migraciones no aplicadas son la causa más común. Guía paso a paso para gestionar migraciones correctamente.
¿Por qué ocurre?
Django no puede encontrar la tabla porque: - Las migraciones no se han aplicado (`python manage.py migrate` no ejecutado) - Se creó un nuevo modelo pero no se generó la migración (`makemigrations` pendiente) - La base de datos es nueva o fue eliminada y no se han aplicado las migraciones - Se está usando una base de datos diferente a la configurada - En tests, la base de datos de pruebas no está inicializada
Solución paso a paso
1. Aplicar migraciones pendientes
# Ver el estado de todas las migraciones
python manage.py showmigrations# Aplicar todas las migraciones pendientes
python manage.py migrate
# Aplicar migraciones de una app específica
python manage.py migrate nombre_app
2. Crear migraciones para modelos nuevos o modificados
# Detectar cambios en los modelos y crear las migraciones
python manage.py makemigrations# Para una app específica
python manage.py makemigrations nombre_app
# Ver qué SQL ejecutará la migración (sin aplicarla)
python manage.py sqlmigrate nombre_app 0001_initial
# Aplicar
python manage.py migrate
3. Base de datos nueva — flujo completo
# Si es una base de datos limpia (nueva instalación)
python manage.py migrate # Crea todas las tablas
python manage.py createsuperuser # Crear admin (opcional)
python manage.py runserver
4. Verificar la configuración de la base de datos
# settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3', # ← ¿existe este archivo?
}
}# Para PostgreSQL
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': os.environ.get('DB_NAME', 'mi_app'),
'USER': os.environ.get('DB_USER', 'postgres'),
'PASSWORD': os.environ.get('DB_PASSWORD', ''),
'HOST': os.environ.get('DB_HOST', 'localhost'),
'PORT': os.environ.get('DB_PORT', '5432'),
}
}
5. Reset de migraciones (casos extremos en desarrollo)
# ⚠️ SOLO en desarrollo — borra todos los datos
# Opción 1: borrar la BD SQLite y re-migrar
rm db.sqlite3
python manage.py migrate# Opción 2: resetear migraciones de una app
python manage.py migrate nombre_app zero # revertir todas las migraciones
python manage.py migrate nombre_app # reaplicar
6. En tests — usar TestCase correctamente
from django.test import TestCaseclass MiModeloTests(TestCase):
# TestCase crea automáticamente una BD de pruebas con todas las tablas
def setUp(self):
self.objeto = MiModelo.objects.create(nombre='Test')
def test_crear_objeto(self):
self.assertEqual(self.objeto.nombre, 'Test')
Cómo evitarlo en el futuro
- Ejecuta `python manage.py migrate` siempre después de hacer `git pull` - Añade `python manage.py migrate` al proceso de despliegue en CI/CD - Nunca edites archivos de migración manualmente a menos que sepas lo que haces - En Docker, ejecuta las migraciones antes de iniciar el servidor: `command: sh -c "python manage.py migrate && python manage.py runserver"`
¿Quieres que una IA te ayude? Genera el prompt perfecto para tu error:
Generador de Prompts