He acumulado bastantes migraciones usando South (0.7) y Django (1.1.2) que están comenzando a consumir bastante tiempo en mis pruebas unitarias. Me gustaría restablecer la línea de base y comenzar un nuevo conjunto de migraciones. Revisé la documentación de South , hice la búsqueda habitual de Google / Stackoverflow (por ejemplo, "django south (restablecer o eliminar o eliminar) historial de migración") y no he encontrado nada obvio.
Un enfoque que he contemplado implicaría "comenzar de nuevo" al "eliminar" South o "borrar" el historial manualmente (por ejemplo, borrar la tabla db, eliminar archivos de migración del director de migraciones) y simplemente volver a ejecutar,
./manage.py schemamigration southtut --inicial
Entonces, si alguien ha hecho esto antes y tiene algunos consejos / sugerencias, sería muy apreciado.
fuente
__init__.py
aappname/migrations
./manage.py makemigrations
pero sucederán cosas malas si no comienza desde una nueva base de datos ...squashmigrations
es la respuesta correctaRespuestas:
Primero, una respuesta del autor del Sur :
Esto es lo que estoy haciendo en mi servidor de producción dev + cuando necesito deshacerme de todas estas migraciones de desarrollo innecesarias:
* excepto si desea limpiar solo una aplicación entre otras, de ser así, deberá editar su tabla south_history y eliminar solo las entradas sobre su aplicación.
fuente
manage.py schemamigration app name --initial
lugar de convert_to_south.south.models.MigrationHistory.objects.all().delete()
.manage.py reset south
es peligroso y puede destruir la base de datos si hay aplicaciones de terceros que usan el sur en el proyecto, como lo señala @thnee a continuación. Dado que su respuesta tiene tantos votos positivos, realmente lo agradecería si pudiera editarlo y agregar al menos una advertencia al respecto, o (aún mejor) cambiarlo para reflejar el enfoque @hobs (que es igual de conveniente, pero no afectar otras aplicaciones) - ¡gracias!Si necesita reiniciar selectivamente (solo una aplicación) las migraciones que están tardando demasiado, esto funcionó para mí.
No olvide restaurar manualmente las dependencias de otras aplicaciones agregando líneas como
depends_on = (("<other_app_name>", "0001_initial"),("<yet_another_app_name>", "0001_initial"))
su<app-dir>/migrations/0001_initial.py
archivo, como el primer atributo en su clase de migración justo debajoclass Migration(SchemaMigration):
.Luego puede hacerlo
./manage.py migrate <app-name> --fake --delete-ghost-migrations
en otros entornos, según esta respuesta SO . Por supuesto, si falsifica la eliminación o la falsificaciónmigrate zero
, deberá eliminar manualmente las tablas db sobrantes con una migración como esta .Una opción más nuclear es
./manage.py migrate --fake --delete-ghost-migrations
en el servidor de implementación en vivo seguido de un [my] sqldump. Luego canalice ese volcado en [my] sql en los entornos donde necesita la base de datos migrada y completamente poblada. Sacrificio sur, lo sé, pero funcionó para mí.fuente
DependsOnUnknownMigration
tiempo fingiendo la nueva migración inicial. Gracias a tu comentario, pude descubrir que debería actualizar ladepends_on
declaración siempre que se refiera a esta aplicación. Esta es realmente la mejor respuesta aquí. ¡Gracias! :)Gracias a las respuestas de Dominique Guardiola y las placas, me ayudó a resolver un problema difícil. Sin embargo, hay un par de problemas con la solución, aquí está mi opinión al respecto.
Usar no
manage.py reset south
es una buena idea si tiene aplicaciones de terceros que usan South, por ejemplodjango-cms
(básicamente todo usa South).reset south
eliminará todo el historial de migración de todas las aplicaciones que haya instalado.Ahora considere que actualiza a la última versión de
django-cms
, contendrá nuevas migraciones como0009_do_something.py
. South seguramente se confundirá cuando intente ejecutar esa migración sin tener que0001
pasar0008
por el historial de migración.Es mucho mejor / más seguro reiniciar selectivamente solo las aplicaciones que está manteniendo .
En primer lugar, asegúrese de que sus aplicaciones no tengan desincronización entre las migraciones en el disco y las migraciones que se han ejecutado en la base de datos. De lo contrario habrá dolor de cabeza.
1. Eliminar el historial de migración de mis aplicaciones
2. Eliminar migraciones para mis aplicaciones
3. Crear nuevas migraciones iniciales para mis aplicaciones
4. Falso ejecutar las migraciones iniciales para mis aplicaciones
Esto inserta las migraciones
south_migrationhistory
sin tocar las tablas reales:Los pasos 3 y 4 en realidad son solo una variante más larga de
manage.py convert_to_south my_app
, pero prefiero ese control adicional, en una situación tan delicada como la modificación de la base de datos de producción.fuente
./manage.py migrate --fake
si no desea falsificar la migración de otras aplicaciones que tienen migraciones pendientes.Al igual que Thnee (vea su respuesta), estamos utilizando un enfoque más suave para la sugerencia del autor del Sur (Andrew Godwin) citada en otro lugar aquí, y estamos separando lo que hacemos con la base de código de lo que hacemos a la base de datos, durante el despliegue , porque necesitamos que las implementaciones sean repetibles:
Lo que hacemos en el código:
Lo que hacemos a la base de datos una vez que se implementa el código
fuente
Si solo está trabajando en la máquina de desarrollo, escribí un comando de administración que hace más o menos lo que Dominique sugirió.
http://balzerg.blogspot.co.il/2012/09/django-app-reset-with-south.html
En contraste con la sugerencia del autor del sur, esto NO DAÑARÁ otras aplicaciones instaladas que usan el sur.
fuente
Lo siguiente es solo si desea restablecer todas las aplicaciones. Haga una copia de seguridad de todas sus bases de datos antes de ese trabajo. También tome nota de su dependen_on en los archivos iniciales si hay alguno.
Por una vez:
Pruebe bootstrapping su proyecto antes de empujar. Luego, para cada máquina local / remota, aplique lo siguiente:
Haga iniciales (3) para cada aplicación que quiera volver a involucrar. Tenga en cuenta que reset (6) eliminará solo el historial de migración, por lo tanto, no es perjudicial para las bibliotecas. Las migraciones falsas (7) retrasarán el historial de migración de cualquier aplicación de terceros instalada.
fuente
eliminar el archivo necesario de la carpeta de la aplicación
ruta de instancia
wiki -es mi aplicación
fuente