with tutorial para framework espaƱol djangoproject con applications python django django-models

python - tutorial - actualizar la base de datos django para reflejar los cambios en los modelos existentes



tutorial django (8)

Ya he definido un modelo y he creado su base de datos asociada a través de manager.py syncdb . Ahora que agregué algunos campos al modelo, intenté syncdb nuevo, pero no aparece ningún resultado. Al intentar acceder a estos nuevos campos desde mis plantillas, recibo una excepción de "No Such Column", lo que me lleva a pensar que syncdb en realidad no actualizó la base de datos. ¿Cuál es el comando correcto aquí?


A partir de Django 1.7+, las migraciones incorporadas admiten , permite migraciones de esquema de base de datos que conservan los datos. Ese es probablemente un mejor enfoque que la solución a continuación.

Otra opción, que no requiere aplicaciones adicionales, es utilizar las funciones incorporadas de manage.py para exportar sus datos, borrar la base de datos y restaurar los datos exportados.

Los métodos a continuación actualizarán las tablas de la base de datos para su aplicación, pero destruirán completamente cualquier información que exista en esas tablas. Si los cambios que realizó en su modelo de aplicación no rompen el esquema anterior (por ejemplo, agregó un nuevo campo opcional), puede simplemente volcar los datos antes y volver a cargarlos después, de esta forma:

Django 1.4.15 y versiones anteriores

python manage.py dumpdata <your_app> > temp_data.json python manage.py reset <your_app> python manage.py loaddata temp_data.json

Django 1.5 y más nuevos

python manage.py dumpdata <your_app> > temp_data.json python manage.py sqlclear <your_app> | python manage.py dbshell python manage.py syncdb python manage.py loaddata temp_data.json

(El comando de reset quedó en desuso y luego se eliminó en Django 1.5 )

Si sus cambios rompen su esquema anterior, esto no funcionará, en cuyo caso herramientas como South o Django Evolution son geniales.


A partir de Django 1.7, ahora puede hacer esto con migraciones nativas. Solo corre

python manage.py makemigrations <your app name> python manage.py migrate


El syncdb de Django no altera las tablas existentes en la base de datos, por lo que debe hacerlo manualmente. La forma en que siempre lo hago es:

  1. Cambia la clase de modelo primero.
  2. A continuación, ejecute: manage.py sql myapp.
  3. Mire el sql que imprime y vea cómo representó el cambio que va a realizar.
  4. Haga el cambio manualmente usando su administrador de base de datos.
  5. Verifique si todo funcionó correctamente utilizando el sitio de administración.

Si está utilizando sqllite, un buen administrador es el complemento de Firefox: link


Otra herramienta sería la evolución django. En la mayoría de los casos, no es necesario dejar una mesa.

evolución django

Simplemente instálalo como cualquier otra aplicación django y ejecuta:

python manage.py evolve --hint --execute


Para las versiones 1.4.1 y posteriores, el comando ha cambiado a

python manage.py flush

Lea el documento oficial antes de usarlo, ya que borrará todos sus datos .


Parece que lo que necesitas es un sistema de migración. South es realmente agradable, funciona estupendamente, tiene algunas herramientas de automatización para facilitar su flujo de trabajo. Y tiene un gran tutorial .

nota: syncdb no puede actualizar sus tablas existentes. A veces es imposible decidir qué hacer de forma automática: por eso los scripts del sur son geniales.


deseb es una gran herramienta para eso.

Al tenerlo instalado, puede escribir ./manage.py sqlevolve y generará los comandos sql necesarios para mantener la estructura de la base de datos sincronizada con sus modelos.


syncdb soltar sus tablas antes de poder volver a syncdb con syncdb .

Si desea conservar sus datos existentes, entonces necesita descargar su base de datos, abandonar sus tablas, ejecutar syncdb para construir una nueva base de datos y luego volver a cargar sus datos antiguos en sus nuevas tablas.

Hay herramientas que ayudan con esto. Sin embargo, en muchos casos, es tan fácil hacerlo manualmente.