Saltar al contenido principal
Django

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.

Error: django.db.utils.OperationalError: no such table

¿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 TestCase

class 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"`

DjangoPythonmigracionesORMbase de datos

¿Quieres que una IA te ayude? Genera el prompt perfecto para tu error:

Generador de Prompts

¿Necesitas desarrollo a medida?

Apps web, IA, módulos ERP — cuéntame tu proyecto.