migrations - ¿Cómo simplificar las migraciones en Django 1.7?
django runpython (11)
Ya hay preguntas similares para South, pero he comenzado mi proyecto con Django 1.7 y no estoy usando South.
Durante el desarrollo, se han creado muchas migraciones, sin embargo, el software aún no se ha desarrollado y no existe una base de datos que deba migrarse. Por lo tanto, me gustaría restablecer las migraciones como si mi modelo actual fuera el original y recrear todas las bases de datos.
¿Cuál es la forma recomendada de hacer eso?
EDITAR: a partir de Django 1.8 hay un nuevo comando llamado squashmigrations que resuelve más o menos el problema descrito aquí.
- Eliminar archivos: delete_migrations.py (en la raíz de prj):
import os for root, dirs, files in os.walk(".", topdown=False): for name in files: if ''/migrations'' in root and name != ''__init__.py'': os.remove(os.path.join(root, name))
DELETE FROM django_migrations Where app in (''app1'', ''app2'');
./manage.py makemigrations
./manage.py migrate --fake
O bien, puede escribir la migración de esto todo
Acabo de tener el mismo problema. Aquí está mi solución.
#!/bin/sh
echo "Starting ..."
echo ">> Deleting old migrations"
find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
find . -path "*/migrations/*.pyc" -delete
# Optional
echo ">> Deleting database"
find . -name "db.sqlite3" -delete
echo ">> Running manage.py makemigrations"
python manage.py makemigrations
echo ">> Running manage.py migrate"
python manage.py migrate
echo ">> Done"
El comando find
: http://unixhelp.ed.ac.uk/CGI/man-cgi?find
Después de eliminar cada carpeta de "migraciones" en mi aplicación (manualmente), ejecuté:
./manage.py dbshell
delete from django_migrations;
Entonces pensé que podría hacer ./manage.py makemigrations
para regenerarlos a todos. Sin embargo, no se detectaron cambios. Luego intenté especificar una aplicación a la vez: ./manage.py makemigrations foo
, ./manage.py makemigrations bar
. Sin embargo, esto dio lugar a dependencias circulares que no pudieron ser resueltas.
Finalmente, ejecuté un único comando makemigrations que especificaba TODAS mis aplicaciones (sin ningún orden en particular):
./manage.py makemigrations foo bar bike orange banana etc
Esta vez, funcionó: las dependencias circulares se resolvieron automáticamente (creó archivos de migraciones adicionales cuando fue necesario).
Luego pude ejecutar ./manage.py migrate --fake
y volví a estar en el negocio.
En la versión de migraciones de Django 1.7, la funcionalidad de restablecimiento que solía estar en el Sur se ha descartado en favor de una nueva funcionalidad para ''aplastar'' sus migraciones. Se supone que esta es una buena forma de controlar el número de migraciones.
https://docs.djangoproject.com/en/dev/topics/migrations/#squashing-migrations
Si todavía quieres empezar desde cero, supongo que todavía podrías vaciar la tabla de migraciones y eliminar las migraciones, después de lo cual volverías a ejecutar makemigrations
.
Intento diferentes comandos y algunas de las respuestas me ayudan. Solo esta secuencia en mi caso solucionó las dos dependencias rotas en migraciones en MYAPP y borraba todas las migraciones pasadas comenzando desde cero.
Antes de hacerlo, asegúrese de que la base de datos ya esté sincronizada (por ejemplo, no agregue un nuevo campo de Modelo aquí o cambie las opciones Meta).
rm -Rf MYAPP/migrations/*
python manage.py makemigrations --empty MYAPP
python manage.py makemigrations
python manage.py migrate --fake MYAPP 0002
Donde 0002 es el número de migración devuelto por el último comando makemigrations.
Ahora puede ejecutar makemigrations / migrate nuevamente normalmente porque la migración 0002 está almacenada pero no reflejada en la base de datos ya sincronizada.
Si estás en modo de desarrollo y solo quieres restablecer todo (base de datos, migraciones, etc.), uso este script basado en la respuesta de Abdelhamid Ba. Esto borrará las tablas de la base de datos (Postgres), eliminará todos los archivos de migración, volverá a ejecutar las migraciones y cargará mis dispositivos iniciales:
#!/usr/bin/env bash
echo "This will wipe out the database, delete migration files, make and apply migrations and load the intial fixtures."
while true; do
read -p "Do you wish to continue?" yn
case $yn in
[Yy]* ) make install; break;;
[Nn]* ) exit;;
* ) echo "Please answer yes or no.";;
esac
done
echo ">> Deleting old migrations"
find ../../src -path "*/migrations/*.py" -not -name "__init__.py" -delete
# Optional
echo ">> Deleting database"
psql -U db_user -d db_name -a -f ./reset-db.sql
echo ">> Running manage.py makemigrations and migrate"
./migrations.sh
echo ">> Loading initial fixtures"
./load_initial_fixtures.sh
echo ">> Done"
archivo reset-db.sql:
DO $$ DECLARE
r RECORD;
BEGIN
-- if the schema you operate on is not "current", you will want to
-- replace current_schema() in query with ''schematodeletetablesfrom''
-- *and* update the generate ''DROP...'' accordingly.
FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = current_schema()) LOOP
EXECUTE ''DROP TABLE IF EXISTS '' || quote_ident(r.tablename) || '' CASCADE'';
END LOOP;
END $$;
Archivo migration.sh:
#!/usr/bin/env bash
cd ../../src
./manage.py makemigrations
./manage.py migrate
archivo load_initial_fixtures.sh:
#!/usr/bin/env bash
cd ../../src
./manage.py loaddata ~/path-to-fixture/fixture.json
Solo asegúrese de cambiar las rutas para que correspondan a su aplicación. Personalmente, tengo estos scripts en una carpeta llamada raíz_proyecto / script / local, y las fuentes de django están en raíz_proyecto / src.
Si no le importan las migraciones anteriores, ¿qué hay de simplemente eliminar todas las migraciones en el directorio migrations /? Comenzará la secuencia de migración desde cero, tomando su modelo actual como referencia como si hubiera escrito todo el modelo ahora.
Si no confías en mí lo suficiente como para eliminarlo, intenta alejarlos.
Suponiendo que esta es su estructura de proyecto,
project_root/
app1/
migrations/
app2/
migrations/
...
manage.py
remove_migrations.py
Puede ejecutar el script remove_migrations.py desde el lugar indicado arriba para eliminar todos los archivos de migraciones.
#remove_migrations.py
"""
Run this file from a Django =1.7 project root.
Removes all migration files from all apps in a project.
"""
from unipath import Path
this_file = Path(__file__).absolute()
current_dir = this_file.parent
dir_list = current_dir.listdir()
for paths in dir_list:
migration_folder = paths.child(''migrations'')
if migration_folder.exists():
list_files = migration_folder.listdir()
for files in list_files:
split = files.components()
if split[-1] != Path(''__init__.py''):
files.remove()
Eliminar manualmente puede ser agotador si tienes un proyecto elaborado. Esto me ahorró mucho tiempo. Eliminar archivos de migración es seguro. Lo he hecho una enésima cantidad de veces sin enfrentar ningún problema ... todavía.
Sin embargo, cuando makemigrations
carpeta de migraciones, makemigrations
o migrate
no creó la carpeta de nuevo para mí. El script se asegura de que la carpeta de migración con su __init__.py
permanezca __init__.py
, solo borrando los archivos de migración.
Tengo esto. Me di cuenta de esto y está bien.
./manage.py migrate --fake <app-name> zero
Una forma simple es
Vaya a cada aplicación y elimine los archivos de migración.
Luego vaya a la tabla django-migrtaions en la base de datos y trunque (elimine todas las entradas).
Después de eso puedes crear migraciones una vez más.
cd al directorio src cd /path/to/src
eliminar directorios de migración rm -rf your_app/migrations/
tenga en cuenta que esto debe hacerse para cada aplicación por separado
migrar python3.3 manage.py migrate
si desea comenzar de nuevo python3.3 manage.py makemigrations your_app