出现的原因
出现这个的问题大概有几种:
- 迁移过程失败,导致 django_migrations 中有记录,但实际没有表
- 修改了 django 内部的表结构没有做相应的处理
诸如这几种原因其实都是因为 django_migrations 表中有与要迁移的新表相关的表,所以迁移的时候导致了冲突发生。
我出现这个问题的原因是继承并扩展了 django 的 AbstractUser 类,进行迁移的时候,由于项目开头执行初始化的 migrate 已经创建了 auth_user 相关的表,该表与我的表功能一致,故发生了冲突。
django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applied before its dependency user.0001_initial on database 'default'.
解决方案
- 删除相关的表
- 删除 django_migrations 中相关的记录
关于第二点需要注意,如果删除 django_migrations 表,那么原本不受影响的表在下一次迁移的时候也会被重新提交,又造成新的冲突,那时候就只能清除数据库了。
示例如下:
在我下面的表中,除了 blog、django_migrations,都是在初始化时新建出来的表。
+----------------------------+
| Tables_in_yipsweb |
+----------------------------+
| auth_group |
| auth_group_permissions |
| auth_permission |
| auth_user |
| auth_user_groups |
| auth_user_user_permissions |
| blog |
| django_admin_log |
| django_content_type |
| django_migrations |
| django_session |
+----------------------------+
删掉对应表之后状态如下:
+-------------------+
| Tables_in_yipsweb |
+-------------------+
| blog |
| django_migrations |
+-------------------+
接下来删除 django_migrations 中对应的记录。在上一步中删除的表位于 id 19 的条目之上,将 id 小于 19 的所有条目删除。
mysql> select * from django_migrations;
+----+--------------+--------------------------------------------------+----------------------------+
| id | app | name | applied |
+----+--------------+--------------------------------------------------+----------------------------+
| 1 | contenttypes | 0001_initial | 2022-03-14 04:07:28.286762 |
| 2 | auth | 0001_initial | 2022-03-14 04:07:29.684629 |
| 3 | admin | 0001_initial | 2022-03-14 04:07:29.956432 |
| 4 | admin | 0002_logentry_remove_auto_add | 2022-03-14 04:07:29.979374 |
| 5 | admin | 0003_logentry_add_action_flag_choices | 2022-03-14 04:07:29.991648 |
| 6 | contenttypes | 0002_remove_content_type_name | 2022-03-14 04:07:30.234672 |
| 7 | auth | 0002_alter_permission_name_max_length | 2022-03-14 04:07:30.380076 |
| 8 | auth | 0003_alter_user_email_max_length | 2022-03-14 04:07:30.436457 |
| 9 | auth | 0004_alter_user_username_opts | 2022-03-14 04:07:30.460891 |
| 10 | auth | 0005_alter_user_last_login_null | 2022-03-14 04:07:30.620477 |
| 11 | auth | 0006_require_contenttypes_0002 | 2022-03-14 04:07:30.629054 |
| 12 | auth | 0007_alter_validators_add_error_messages | 2022-03-14 04:07:30.642607 |
| 13 | auth | 0008_alter_user_username_max_length | 2022-03-14 04:07:30.761427 |
| 14 | auth | 0009_alter_user_last_name_max_length | 2022-03-14 04:07:30.913584 |
| 15 | auth | 0010_alter_group_name_max_length | 2022-03-14 04:07:30.949697 |
| 16 | auth | 0011_update_proxy_permissions | 2022-03-14 04:07:30.963744 |
| 17 | auth | 0012_alter_user_first_name_max_length | 2022-03-14 04:07:31.101315 |
| 18 | sessions | 0001_initial | 2022-03-14 04:07:31.184898 |
| 19 | blog | 0001_initial | 2022-03-15 08:45:10.789230 |
| 20 | blog | 0002_alter_blogmodel_articleid | 2022-03-15 16:50:59.163678 |
| 21 | blog | 0003_alter_blogmodel_options_blogmodel_viewcount | 2022-03-16 01:37:30.220132 |
+----+--------------+--------------------------------------------------+----------------------------+
删除后重新执行迁移,成功