¿Por qué no funcionan mis migraciones al sur?

78

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")

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

Muy bien, sigo esas instrucciones

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

Pero cuando ejecuto syncdb, Django crea un montón 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é 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á cabreando. ¿Alguien puede ayudar? Gracias.

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

Eso es TAN TONTO.

TIMEX
fuente
6
La respuesta de Ken es básicamente correcta en lo que respecta a las soluciones, pero solo para señalar qué salió mal para que pueda aprender de ello: eliminar su directorio de migraciones fue el problema la segunda vez. A partir de una base de datos limpia: 1. cree sus migraciones para las aplicaciones que las utilicen, 2. ejecute syncdb, 3. ejecute el comando migrate. Eso usará syncdb para crear tablas no migradas y south para crear tablas migradas. Un último punto: cuando la salida syncdb dice "No sincronizado (use migraciones):" asegúrese de leer lo que realmente viene después. No hubo nada que migrar en su salida porque no tuvo migraciones.
Gabriel Hurley
2
+1 por proporcionar un análisis exhaustivo de su problema
Filip Dupanović
Si se trata de clases en varios archivos, compruebe si tiene app_label en todos ellos.
andilabs

Respuestas:

175

South le permite crear migraciones cuando comienza por primera vez con una nueva aplicación y las tablas aún no se han agregado a la base de datos, además de crear 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 South administrara esa aplicación, por lo que creó las tablas por usted. Cuando creó sus migraciones iniciales y luego ejecutó migrate, south estaba tratando de crear tablas que django ya había creado y, por lo tanto, su error.

En este punto tienes dos opciones.

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

  2. Falsificar la ejecución de la migración inicial $ py manage.py migrate wall 0001 --fakeEsto le dirá a South que ya tienes las tablas en la base de datos, así que simplemente fíngelo, lo que agregará una fila a la tabla south_migrationhistory, para que la próxima vez que ejecutes una migración, sepa que la primera migración ya se ha ejecutado.

Configurar un proyecto nuevo y sin base de datos

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

Configurar un proyecto y una base de datos heredados

  1. agregar sur a las aplicaciones instaladas
  2. ejecutar 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 --initialEsto creará sus migraciones iniciales
  4. para cada una de sus aplicaciones que se ejecutan python manage.py migrate app_name 0001 --fake, esto simulará hacia el sur, no hará nada en la base de datos para esos modelos, solo agregará registros a la tabla south_migrationhistory para que la próxima vez que desee crear una migración, esté todo conjunto.

Configurar un proyecto heredado y sin base de datos

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

Ahora que está configurado con South, puede comenzar a usar South para administrar los cambios de modelo en esas aplicaciones. El comando más común para ejecutar es python manage.py schemamigration app_name migration_name --autoque buscará en la última migración que ejecutó y encontrará los cambios y creará un archivo de migración para usted. Entonces solo necesita ejecutar python manage.py migratey alterar su base de datos por usted.

Espero que ayude.

Ken Cochrane
fuente
3
Buena respuesta, Ken. Podría pensar en editar su respuesta para incorporar un poco más de lo que realmente salió mal en el proceso (vea mi comentario arriba), solo para que las personas futuras que se encuentren con su respuesta obtengan la mejor información posible.
Gabriel Hurley
@Gabriel Me gustó que sugiriste y agregué más información a mi respuesta. Gracias por la ayuda.
Ken Cochrane
1
Por cierto, esto es para tomar su proyecto que no es del Sur y agregar Sur, no para poner en funcionamiento un proyecto que ya usa Sur. En esos casos, un syncdb & migrate es todo lo que necesita.
Bryan
11

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 -sur-explicado /

CppLearner
fuente
8

El tutorial que estás usando dice:

(Si esto falla 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 tomado, seguir ese enlace parece mostrar que se perdió un paso antes de configurar su nueva aplicación. Como sigue un tutorial para configurar migraciones en una nueva aplicación, el orden es:

  1. Agregar sur aINSTALLED_APPS .
  2. correr syncdb .
  3. Luego sigue el tutorial.

Es decir, ya debería haberlo ejecutado syncdbantes de agregar los modelos para su nueva aplicación. Su solución para eliminar su aplicación INSTALLED_APPSdebería funcionar, pero vale la pena señalar que en realidad es solo una solución "tonta", ya que se perdió un paso antes. Si se syncdbhubiera ejecutado antes de crear los modelos para esa aplicación, no tendría que usar la solución alternativa.

Andrés
fuente
3

Solo para futura ref. Si el sur le está dando algún problema:

  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. Vuelva a usar South (por ejemplo, './manage.py convert_to_south algo, ./manage.py migrate ...')
Robert Johnstone
fuente
1

Esto parece obvio, pero recomiendo encarecidamente leer los documentos.

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

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

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 Coding Horror de Jeff Atwood sobre el control de versiones de bases de datos.

Ashley Davis
fuente
+1 Acabo de llegar al punto en que estoy tan cansado de que los monos arreglen todos los errores extraños del Sur. Lamentablemente, no ayuda mucho con respecto al sur. Tal vez debería sentarme y leer el documento como dices.
Philip007
0

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

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

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

Wolph
fuente