2009-12-31 39 views
66

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

+1

Debe cambiar la respuesta aceptada. – User

Respuesta

33

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.

+6

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

+0

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

+0

enlaces en la respuesta están rotos –

3

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.

+0

Esto se parece a lo que necesitaba. ¿Sqlevolve también confirma los cambios? – theactiveactor

2

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.

8

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. Primero cambie la clase de modelo.
  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. Haz el cambio manualmente usando tu administrador de base de datos.
  5. Comprueba si todo funcionó correctamente utilizando el sitio de administración.

Si está utilizando SQLLite un buen gerente es el complemento de Firefox: link

+0

Creo que esta es la mejor y más fácil solución – shrimpwagon

8

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

django evolution

sólo tiene que instalar como cualquier otra aplicación de Django y ejecutar:

python manage.py evolucionar --hint --execute

137

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.

+0

Gracias por esto. Justo lo que estaba buscando. –

+0

Creo que esta solución es la mejor. –

+0

gracias, la mejor solución :) –

1

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.

+0

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 –

33

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 
Cuestiones relacionadas