python - inconsistent - force makemigrations
¿Cómo sabe django qué migraciones se han ejecutado? (5)
Como indican otras respuestas, django tiene una tabla especial django_migrations
donde mantiene el historial de migración.
Si está interesado en excavar un poco más, consulte la clase MigrationRecorder
que es responsable de registrar las migraciones en la base de datos. Además, aquí está el modelo subyacente para la tabla django_migrations
:
class Migration(models.Model):
app = models.CharField(max_length=255)
name = models.CharField(max_length=255)
applied = models.DateTimeField(default=now)
class Meta:
apps = Apps()
app_label = "migrations"
db_table = "django_migrations"
def __str__(self):
return "Migration %s for %s" % (self.name, self.app)
¿Cómo sabe django si una migración ya se ha aplicado? Por lo general, lo hace bien, pero cuando no lo hace, nunca sé dónde empezar a solucionar problemas.
Si es django1.7, almacena el historial en la base de datos, tabla django_migrations
. South también almacena las migraciones en la base de datos, y puede habilitar la función para mostrar el historial de migración en django admin.
Simplemente puede usar el comando showmigrations para proporcionar una lista de migraciones
$ python manage.py showmigrations
si se aplica o no cada migración (marcada con una [X] junto al nombre de la migración).
~/workspace $ python manage.py showmigrations
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
sessions
[X] 0001_initial
Usar showmigrations
es ideal para el caso de uso básico. Esperemos que nunca tengas que usar nada más allá de eso. Sin embargo, si comienza a usar la funcionalidad "reemplaza" para aplastar las migraciones, el comportamiento esperado puede volverse extremadamente no trivial.
Como parte de la respuesta a la pregunta "¿cómo sabe Django qué migraciones se han ejecutado?", ¡Almacenan registros de migraciones aplicadas en la base de datos!
Si desea echar un vistazo a lo que almacenan en la base de datos, eche un vistazo a lo siguiente utilizando el shell Django.
from django.db.migrations.recorder import MigrationRecorder
[(m.app, m.name) for m in MigrationRecorder.Migration.objects.all()]
Para casos sencillos, esto debe corresponder directamente de 1 a 1 con lo que se muestra en las showmigrations
. Sin embargo, aplastó algunas migraciones (reemplazó algunas migraciones con otras), debe saber que Django compara las migraciones almacenadas en la base de datos con las migraciones almacenadas en el disco, y el proceso se vuelve bastante no trivial.
Entonces, para refinar esta respuesta a "¿cómo sabe Django qué migraciones se han ejecutado?" El comando showmigrations
muestra el resultado del algoritmo de resolución de migración de Django, que utiliza varias fuentes de información, una de las cuales incluye una tabla con los nombres de todos los nombres literales de las migraciones que se han aplicado. Para saber cómo pasar de uno a otro ... lea el código fuente.
Django escribe un registro en la tabla django_migrations
consiste en información como la aplicación a la que pertenece la migración, el nombre de la migración y la fecha en que se aplicó.