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.
fuente
Respuestas:
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.
Elimine las tablas para la aplicación de muro de su base de datos y luego ejecute.
$ py manage.py migrate wall
Esto ejecutará la migración y creará sus tablas.Falsificar la ejecución de la migración inicial
$ py manage.py migrate wall 0001 --fake
Esto 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
python manage.py schemamigration app_name --initial
esto creará los archivos de migración iniciales para su aplicaciónpython manage.py migrate app_name
esto agregará las tablas a la base de datos.Configurar un proyecto y una base de datos heredados
python manage.py schemamigration app_name --initial
Esto creará sus migraciones inicialespython 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
python manage.py schemamigration app_name --initial
Esto creará sus migraciones inicialespython manage.py migrate
esto 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 --auto
que buscará en la última migración que ejecutó y encontrará los cambios y creará un archivo de migración para usted. Entonces solo necesita ejecutarpython manage.py migrate
y alterar su base de datos por usted.Espero que ayude.
fuente
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 /
fuente
El tutorial que estás usando dice:
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:
INSTALLED_APPS
.syncdb
.Es decir, ya debería haberlo ejecutado
syncdb
antes de agregar los modelos para su nueva aplicación. Su solución para eliminar su aplicaciónINSTALLED_APPS
deberí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 sesyncdb
hubiera ejecutado antes de crear los modelos para esa aplicación, no tendría que usar la solución alternativa.fuente
Solo para futura ref. Si el sur le está dando algún problema:
fuente
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.
fuente
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.
fuente