python django migration django-south

python - ¿Por qué no funcionan mis migraciones al sur?



django migration (6)

¿Cómo hago para que South funcione y se sincronice correctamente con todo? Lo único que se me ocurre es eliminar mi aplicación de INSTALLED_APPS, luego ejecutar syncdb y luego volver a agregarla.

He usado esa solución con problemas del Sur en el pasado. No es una solución bonita, pero es muy efectiva;)

Pero el principal problema es que su pedido no es correcto. Deberías haber ejecutado syncdb antes del tutorial. De lo que funciona correctamente

Primero, creo mi base de datos.

create database mydb;

Agrego "sur" a las aplicaciones instaladas. Luego, voy a este tutorial: http://south.aeracode.org/docs/tutorial/part1.html

El tutorial me dice que haga esto:

$ py manage.py schemamigration wall --initial >>> Created 0001_initial.py. You can now apply this migration with: ./manage.py migrate wall

Genial, ahora migro.

$ py manage.py migrate wall

Pero me da este error ...

django.db.utils.DatabaseError: (1146, "Table ''fable.south_migrationhistory'' doesn''t exist")

Así que uso Google (que nunca funciona, de ahí mis 870 preguntas formuladas en Stackoverflow), y obtengo esta página: http://groups.google.com/group/south-users/browse_thread/thread/d4c83f821dd2ca1c

Bien, entonces sigo esas instrucciones

>> Drop database mydb; >> Create database mydb; $ rm -rf ./wall/migrations $ py manage.py syncdb

Pero cuando ejecuto syncdb, Django crea un conjunto de tablas. Sí, crea la tabla south_migrationhistory, pero también crea las tablas de mi aplicación.

Synced: > django.contrib.admin > django.contrib.auth > django.contrib.contenttypes > django.contrib.sessions > django.contrib.sites > django.contrib.messages > south > fable.notification > pagination > timezones > fable.wall > mediasync > staticfiles > debug_toolbar Not synced (use migrations): - (use ./manage.py migrate to migrate these)

Genial ... ahora me dice que migre estos. Entonces, hago esto:

$ py manage.py migrate wall The app ''wall'' does not appear to use migrations.

Muy bien, muy bien. Agregaré el muro a las migraciones iniciales.

$ py manage.py schemamigration wall --initial

Luego migro:

$ py manage.py migrate wall

¿Sabes que? Me da esta BS:

_mysql_exceptions.OperationalError: (1050, "Table ''wall_content'' already exists")

Lo siento, esto realmente me está molestando. ¿Alguien puede ayudar? Gracias.

¿Cómo hago para que South funcione y se sincronice correctamente con todo? Lo único que se me ocurre es eliminar mi aplicación de INSTALLED_APPS, luego ejecutar syncdb y luego volver a agregarla.

Eso es TAN SILLY.


Así es como hago que las cosas funcionen.

pip install South # add ''south'', to INSTALL_APPS, then python manage.py syncdb # For existing project + database python manage.py convert_to_south app_name # Thereafter, call them per model changes python manage.py schemamigration app_name --auto python manage.py migrate app_name

Referencias

http://garmoncheg.blogspot.com/2011/08/django-how-and-why-to-use-migrations.html http://www.djangopro.com/2011/01/django-database-migration-tool-south-explained/


El tutorial que estás usando establece:

(Si esto no funciona y se queja de que south_migrationhistory no existe, olvidó ejecutar syncdb después de instalar South ).

Suponiendo que su publicación detalla con precisión los pasos que ha realizado, seguir ese enlace parece indicar que se perdió un paso antes de configurar su nueva aplicación. Como está siguiendo un tutorial para configurar migraciones en una nueva aplicación, el orden es:

  1. Agregue al sur a INSTALLED_APPS .
  2. Ejecute syncdb .
  3. Luego sigue el tutorial.

Es decir, ya debería haber ejecutado syncdb antes de agregar los modelos para su nueva aplicación. Su solución para eliminar su aplicación de INSTALLED_APPS debería funcionar, pero vale la pena señalar que realmente es solo una solución "tonta", ya que se perdió un paso anterior. Si syncdb hubiera ejecutado antes de crear los modelos para esa aplicación, no tendría que usar la syncdb .


Esto parece obvio, pero recomiendo leer los documentos.

Incluso después de leer las respuestas a esta pregunta me costó entender cómo usar el Sur de manera efectiva.

Todo eso cambió, por supuesto, el día que leí los documentos y tú también deberías, South es más fácil de usar de lo que crees.

http://south.aeracode.org/docs/about.html

http://south.aeracode.org/docs/tutorial/index.html

http://south.aeracode.org/docs/convertinganapp.html#converting-an-app

También encontré esto útil:

http://www.djangopro.com/2011/01/django-database-migration-tool-south-explained/

Y asegúrese de leer los artículos de Coding Horror de Jeff Atwood sobre el control de la versión de la base de datos.


Solo para futuras referencias Si South te está dando problemas:

  1. Elimina los directorios de migraciones de los directorios de tu aplicación
  2. Eliminar South_migrations de su base de datos
  3. Ejecute manage.py syncdb
  4. Vuelve a usar el sur (por ejemplo, ''./manage.py convert_to_south something, ./manage.py migrate ...'')

South le permite crear migraciones cuando comienza con una nueva aplicación y las tablas aún no se han agregado a la base de datos, así como también crea migraciones para aplicaciones heredadas que ya tienen tablas en la base de datos. La clave es saber cuándo hacer qué.

Su primer error fue cuando eliminó sus migraciones, tan pronto como lo hizo, y luego ejecutó syncdb, Django no sabía que quería que sur administrara esa aplicación, por lo que creó las tablas para usted. Cuando creó sus migraciones iniciales y luego ejecutó la migración, south intentó crear tablas que django ya había creado y, por lo tanto, su error.

En este punto tienes dos opciones.

  1. Elimine las tablas de la aplicación de pared de su base de datos y luego ejecute $ py manage.py migrate wall Esto ejecutará la migración y creará sus tablas.

  2. Simplifique la migración inicial ejecute $ py manage.py migrate wall 0001 --fake Esto le indicará al sur que ya tiene las tablas en la base de datos, así que simplemente falsifíquela, lo que agregará una fila a la tabla south_migrationhistory, para que la próxima vez ejecuta una migración, sabrá que la primera migración ya se ejecutó.

Configuración de un nuevo proyecto y sin base de datos

  1. crea tu base de datos
  2. agregar al sur a las aplicaciones instaladas
  3. ejecuta syncdb, esto agregará las tablas django y south a la base de datos
  4. agrega tus aplicaciones
  5. para cada aplicación ejecute python manage.py schemamigration app_name --initial esto creará los archivos de migración iniciales para su aplicación
  6. luego ejecuta south python manage.py migrate app_name esto agregará las tablas a la base de datos.

Configuración de un proyecto heredado y una base de datos

  1. agregar al sur a las aplicaciones instaladas
  2. ejecuta syncdb, esto agregará las tablas del sur a la base de datos
  3. para cada una de sus aplicaciones, ejecute python manage.py schemamigration app_name --initial Esto creará sus migraciones iniciales
  4. para cada una de sus aplicaciones, ejecute python manage.py migrate app_name 0001 --fake , esto se falsificará hacia el sur, no hará nada en la base de datos para esos modelos, simplemente agregará registros a la tabla south_migrationhistory para que la próxima vez Si desea crear una migración, ya está todo listo.

Configuración de un proyecto heredado y sin base de datos

  1. crear base de datos
  2. agregar al sur a las aplicaciones instaladas
  3. para cada una de sus aplicaciones, ejecute python manage.py schemamigration app_name --initial Esto creará sus migraciones iniciales
  4. Ejecute syncdb, esto agregará cualquier aplicación que no tenga migraciones a la base de datos.
  5. luego ejecuta south python manage.py migrate esto ejecutará todas las migraciones para tus aplicaciones.

Ahora que está configurado con el sur, puede comenzar a usar el sur para administrar los cambios del modelo en esas aplicaciones. El comando más común para ejecutar es python manage.py schemamigration app_name migration_name --auto que examinará la última migración que ejecutó y encontrará los cambios y construirá un archivo de migración para usted. Entonces solo necesitas ejecutar python manage.py migrate y altera tu base de datos por ti.

Espero que ayude.