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:
- Cambia la clase de modelo primero.
- A continuación, ejecute: manage.py sql myapp.
- Mire el sql que imprime y vea cómo representó el cambio que va a realizar.
- Haga el cambio manualmente usando su administrador de base de datos.
- 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.
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.