Ya he definido un modelo y he creado su base de datos asociada a través de manager.py syncdb
. Ahora que he agregado algunos campos al modelo, intenté con syncdb
nuevamente, 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í?actualizar la base de datos django para reflejar los cambios en los modelos existentes
Respuesta
Parece que lo que necesita es un sistema de migración. South es muy bueno, funciona bien, 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.
gracias por señalar esta interesante herramienta. Para cualquier persona interesada, hay una discusión profunda sobre la migración de la base de datos django aquí: http://code.djangoproject.com/wiki/SchemaEvolution – theactiveactor
El enlace de South muestra, "South ha sido desaprobado. Desde Django 1.7 hacia arriba, las migraciones están incorporadas el núcleo de Django. Si está ejecutando una versión anterior, puede encontrar el repositorio en BitBucket ". ¿Y ahora qué? – FaithReaper
enlaces en la respuesta están rotos –
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.
Esto se parece a lo que necesitaba. ¿Sqlevolve también confirma los cambios? – theactiveactor
Necesita soltar sus tablas antes de poder recrearlas con syncdb
.
Si desea conservar sus datos existentes, entonces necesita descargar su base de datos, deje caer sus tablas, ejecute syncdb
para compilar una nueva base de datos, luego vuelva a cargar sus datos anteriores en sus nuevas tablas.
Hay herramientas que ayudan con esto. Sin embargo, en muchos casos, es tan fácil hacerlo manualmente.
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:
- Primero cambie la clase de modelo.
- A continuación, ejecute: manage.py sql myapp.
- Mire el sql que imprime y vea cómo representó el cambio que va a realizar.
- Haz el cambio manualmente usando tu administrador de base de datos.
- Comprueba si todo funcionó correctamente utilizando el sitio de administración.
Si está utilizando SQLLite un buen gerente es el complemento de Firefox: link
Creo que esta es la mejor y más fácil solución – shrimpwagon
Otra herramienta sería la evolución de Django. En la mayoría de los casos, no es necesario dejar una mesa.
sólo tiene que instalar como cualquier otra aplicación de Django y ejecutar:
python manage.py evolucionar --hint --execute
As of Django 1.7+, built-in migrations support , allows for database schema migrations that preserve data. That's probably a better approach than the solution below.
Otra opción, que no requieren aplicaciones adicionales, es utilizar las funciones integradas en 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 por completo cualquier dato que exista en esas tablas. Si los cambios realizados en su modelo de aplicación no rompen su esquema anterior (por ejemplo, agregó un nuevo campo opcional), puede simplemente volcar los datos antes y volver a cargarlos, como sigue:
Django 1.4.15 y anterior
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 reciente
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 reset
desfasada y luego se retira en Django 1.5)
Si los cambios rompen el esquema anterior, esto no funcionará, en cuyo caso las herramientas como South o Django Evolution son geniales.
Gracias por esto. Justo lo que estaba buscando. –
Creo que esta solución es la mejor. –
gracias, la mejor solución :) –
Para las versiones 1.4.1 y anteriores usuarios el comando ha cambiado a
python manage.py flush
favor lea la official document antes de utilizarlo como que eliminará todos sus datos.
Lo que no entiendo es que flush realmente restablece la base de datos tal como estaba después de ejecutar' syncdb', pero ¿qué ocurre con los campos potencialmente recién agregados? ? No se crean –
A partir de Django 1.7, ahora puede hacer esto con migraciones nativas. Simplemente ejecute
python manage.py makemigrations <your app name>
python manage.py migrate
- 1. ImageView no actualizar/reflejar cambios
- 2. Los datos del informe RDLC no se actualizan para reflejar los cambios
- 3. Realizando un seguimiento de los cambios desde el último guardado en los modelos django
- 4. ¿Cómo actualizar una base de datos SQLite y NO perder todos los datos existentes?
- 5. generar modelos de tablas existentes utilizando los carriles 3
- 6. ¿Los cursores de la base de datos recogen los cambios en los datos subyacentes?
- 7. Cómo fusionar los cambios en la base de datos Drupal
- 8. django: actualizar esquema de base de datos sin perder datos
- 9. Clasificar matriz y reflejar los cambios en otra matriz
- 10. Cómo actualizar en base a datos existentes en mongo
- 11. Base de datos: insertar nuevas filas o actualizar las existentes?
- 12. Diseñador de GUI para administrar los modelos de Django
- 13. Re evaluar consulta Django después de los cambios realizados a la base de datos
- 14. Alterar las tablas de la base de datos en Django
- 15. ¿Es posible generar modelos django desde la base de datos?
- 16. ¿Actualizar db/migrar después de actualizar manualmente los modelos?
- 17. ¿Cómo funcionan los modelos Django?
- 18. Campo de UUID agregado después de los datos que ya están en la base de datos. ¿Hay alguna forma de llenar el campo UUID para los datos existentes?
- 19. Django: ¿Cambiar modelos sin borrar todos los datos?
- 20. Django Queryset en todos los modelos?
- 21. Django: Representación de cadena de los modelos
- 22. Django Captcha simple con los django.contrib.auth.forms existentes
- 23. ¿Cómo obtengo un WGD DataGrid para guardar los cambios de nuevo en la base de datos?
- 24. Cómo manejar los cambios en los datos duplicados en NoSQL
- 25. ¿Podemos actualizar los datos en la vista
- 26. ¿Hay un buen WikiField para los modelos django?
- 27. Generar hashes únicos para los modelos de django
- 28. ¿Cómo hacer únicos en los modelos de Django? Y también indexar una columna en Django
- 29. Patrón de datos básicos: ¿cómo actualizar eficientemente la información local con los cambios de la red?
- 30. Actualizar una colección Backbone.js sin borrar los modelos anteriores
Debe cambiar la respuesta aceptada. – User