Cómo reiniciar las migraciones de tu proyecto en Django, Cómo reiniciar las migraciones de tu proyecto en Django

Cómo reiniciar las migraciones de tu proyecto en Django

Cómo reiniciar las migraciones de tu proyecto en Django…

Antes que nada debo mencionarte que el sistema de migraciones de Django fue desarrollado y optimizado para trabajar con una cantidad muy grande de migraciones. No deberías preocuparte por tener un gran número de migraciones en tu código aunque algunas veces puede causar problemas, como aumentar mucho tiempo de las pruebas unitarias de tu proyecto. 

De cualquier forma, si quieres realizar una limpia te daré algunas opciones para hacerlo dependiendo de cual sea tu caso.

Cómo reiniciar las migraciones de tu proyecto en Django, Cómo reiniciar las migraciones de tu proyecto en Django

Caso 1 - Cómo reiniciar las migraciones de tu proyecto en Django durante el desarrollo

Si tu proyecto sigue en desarrollo temprano y no ha salido a producción puedes darte el lujo de hacer una limpia total, no te importará eliminar toda la base de datos.

1. Elimina todos los archivos de migraciones de tu proyecto

Ve por cada una de tus aplicaciones en el proyecto y elimina todo lo que se encuentre dentro de la carpeta de migraciones excepto por el archivo __init__.py

Si estás usando un sistema operativo tipo unix puedes correr los siguientes comandos desde el directorio principal de tu proyecto Django.

find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
find . -path "*/migrations/*.pyc"  -delete

2. Elimina la base de datos, borra el archivo db.sqlite3 si ese es tu caso

3. Crea las migraciones iniciales y genera el esquema de la base de datos

python manage.py makemigrations
python manage.py migrate

Caso 2 - Cómo reiniciar las migraciones de tu proyecto en Django en producción

Quieres eliminar las migraciones pero mantener la base de datos.

1. Asegurate que tus modelos encajen en la base de datos actual

La forma más fácil de hacerlo es tratando de crear nuevas migraciones:

python manage.py makemigrations

Si todavía tienes migraciones sin aplicar, hazlo:

python manage.py migrate

2. Elimina el historial de migraciones de cada aplicación

Debes borrarlas de una por una, corre primero showmigrations para saber que es lo que está sucediendo con las migraciones.

python manage.py showmigrations

Resultado:

admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
auth
 [X] 0001_initial
 [X] 0002_alter_permission_name_max_length
 [X] 0003_alter_user_email_max_length
 [X] 0004_alter_user_username_opts
 [X] 0005_alter_user_last_login_null
 [X] 0006_require_contenttypes_0002
 [X] 0007_alter_validators_add_error_messages
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
my_app
 [X] 0001_initial
 [X] 0002_remove_mymodel_name
 [X] 0003_mymodel_field
sessions
 [X] 0001_initial

Limpia el historial de migraciones de todas TUS aplicaciones:

python manage.py migrate --fake my_app zero

Resultado:

Operations to perform:
  Unapply all migrations: my_app
Running migrations:
  Rendering model states... DONE
  Unapplying my_app.0003_mymodel_field... FAKED
  Unapplying my_app.0002_remove_mymodel_name... FAKED
  Unapplying my_app.0001_initial... FAKED

Corre el comando showmigrations de nuevo:

python manage.py showmigrations

Resultado:

admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
auth
 [X] 0001_initial
 [X] 0002_alter_permission_name_max_length
 [X] 0003_alter_user_email_max_length
 [X] 0004_alter_user_username_opts
 [X] 0005_alter_user_last_login_null
 [X] 0006_require_contenttypes_0002
 [X] 0007_alter_validators_add_error_messages
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
my_app
 [ ] 0001_initial
 [ ] 0002_remove_mymodel_name
 [ ] 0003_mymodel_field
sessions
 [X] 0001_initial

Debes hacer lo mismo con todas tus aplicaciones.

3. Elimina los archivos de migraciones

Ve por cada una de tus aplicaciones en el proyecto y elimina todo lo que se encuentre dentro de la carpeta de migraciones excepto por el archivo __init__.py

Si estás usando un sistema operativo tipo unix puedes correr los siguientes comandos desde el directorio principal de tu proyecto Django.

find . -path "*/migrations/*.py" -not -name "__init__.py" -delete
find . -path "*/migrations/*.pyc"  -delete

Corre el comando showmigrations de nuevo:

python manage.py showmigrations

Resultado:

admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
auth
 [X] 0001_initial
 [X] 0002_alter_permission_name_max_length
 [X] 0003_alter_user_email_max_length
 [X] 0004_alter_user_username_opts
 [X] 0005_alter_user_last_login_null
 [X] 0006_require_contenttypes_0002
 [X] 0007_alter_validators_add_error_messages
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
my_app
 (no migrations)
sessions
 [X] 0001_initial

4. Crea las migraciones iniciales

python manage.py makemigrations

Resultado:

Migrations for 'my_app':
  0001_initial.py:
    - Create model MyModel

5. Finge las migraciones iniciales

No podrás aplicar la migración debido a que los cambios ya fueron aplicados a la base de datos anteriormente. En su lugar debes fingir la aplicación de la migración:

python manage.py migrate --fake-initial

Resultado:

Operations to perform:
  Apply all migrations: admin, contenttypes, auth, my_app, sessions
Running migrations:
  Rendering model states... DONE
  Applying my_app.0001_initial... FAKED

Corre el comando showmigrations de nuevo:

python manage.py showmigrations

Resultado:

admin
 [X] 0001_initial
 [X] 0002_logentry_remove_auto_add
auth
 [X] 0001_initial
 [X] 0002_alter_permission_name_max_length
 [X] 0003_alter_user_email_max_length
 [X] 0004_alter_user_username_opts
 [X] 0005_alter_user_last_login_null
 [X] 0006_require_contenttypes_0002
 [X] 0007_alter_validators_add_error_messages
contenttypes
 [X] 0001_initial
 [X] 0002_remove_content_type_name
my_app
 [X] 0001_initial
sessions
 [X] 0001_initial

Y listo, ya tienes el historial de migraciones limpio!

Si te quedaron dudas sobre los comandos utilizados recuerda que siempre contamos con la documentación oficial de Django respecto a las migraciones.

Si te gustó o esta información te fue de utilidad en tu proyecto no dudes en revisar mis otras publicaciones de blog, seguro encontrarás algo que te parezca interesante.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *