django.db.migrations.exceptions.InconsistentMigrationHistory

Har*_*nan 46 python django database-migration django-models django-rest-framework

当我跑

python manage.py migrate
Run Code Online (Sandbox Code Playgroud)

在我的django项目中,我收到以下错误

Traceback (most recent call last):
File "manage.py", line 22, in <module>
execute_from_command_line(sys.argv)
File "/home/hari/project/env/local/lib/python2.7/site-     packages/django/core/management/__init__.py", line 363, in execute_from_command_line
utility.execute()
File "/home/hari/project/env/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 355, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/hari/project/env/local/lib/python2.7/site-packages/django/core/management/base.py", line 283, in run_from_argv
self.execute(*args, **cmd_options)
File "/home/hari/project/env/local/lib/python2.7/site-packages/django/core/management/base.py", line 330, in execute
output = self.handle(*args, **options)
File "/home/hari/project/env/local/lib/python2.7/site-packages/django/core/management/commands/migrate.py", line 86, in handle
executor.loader.check_consistent_history(connection)
File "/home/hari/project/env/local/lib/python2.7/site-packages/django/db/migrations/loader.py", line 298, in check_consistent_history
connection.alias,
django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applied before its dependency account.0001_initial on database 'default'.
Run Code Online (Sandbox Code Playgroud)

我有一个像下面这样的用户模型

class User(AbstractUser):
place = models.CharField(max_length=64, null=True, blank=True)
address = models.CharField(max_length=128, null=True, blank=True)
Run Code Online (Sandbox Code Playgroud)

那我怎么解决这个问题呢?

小智 65

由于您使用的是自定义用户模型,因此您可以先注释掉

INSTALLED_APPS = [
...
#'django.contrib.admin',
...
]
Run Code Online (Sandbox Code Playgroud)

在您的Installed_Apps设置中.然后跑

python manage.py migrate.
Run Code Online (Sandbox Code Playgroud)

完成后取消注释

'django.contrib.admin'
Run Code Online (Sandbox Code Playgroud)

  • 不要忘记 urls.py 中的注释路径('admin/', admin.site.urls) (27认同)
  • 它对我不起作用。错误消息是“没有安装带有标签admin的应用程序”,我是否需要首先删除迁移中的所有文件?有人知道如何解决吗?谢谢〜 (7认同)
  • 检查下面的 user9414732 答案。 (3认同)

Air*_*irs 34

让我们从这个页面上的大多数答案解决问题开始:

如果正确使用Django的迁移系统,则永远不必删除数据库,并且一旦进行了迁移,就不应该删除迁移

现在,最适合您的解决方案取决于许多因素,包括您对Django的体验,对迁移系统的理解程度以及数据库中数据的价值.

简而言之,有两种方法可以解决任何迁移错误.

  1. 采取选择.警告:这只是一个选项,你是独自工作.如果其他人依赖现有迁移,则无法删除它们.

    • 删除所有迁移,然后重建一个新的集python3 -m manage makemigrations.这应该可以消除您在迁移中遇到的依赖关系或不一致问题.
    • 删除整个数据库.这将消除您在实际数据库架构与基于迁移历史记录的架构之间存在的不一致所带来的任何问题,并将消除您的迁移历史记录与先前迁移文件之间的不一致所带来的任何问题[这就是的InconsistentMigrationHistory抱怨.
    • 使用重新创建数据库架构 python3 -m manage migrate
  2. 确定错误的原因并解决它,因为(根据经验说)原因几乎肯定是做的傻事.(通常由于不了解如何正确使用迁移系统).基于错误我已经导致了三个类别.

    1. 迁移文件不一致.当多个人正在处理项目时,这是一个非常常见的问题.希望您的更改不会发生冲突并且makemigrations --merge可以解决此问题,否则有人将不得不将其迁移回滚到分支点以解决此问题.
    2. 架构与迁移历史记录之间存在不一致.要管理此人,将手动编辑数据库架构或删除迁移.如果他们删除了迁移,那么还原他们的更改并对他们大喊大叫; 如果其他人依赖迁移,您永远不应该删除迁移.如果他们手动编辑数据库模式,则还原他们的更改然后对它们大喊大叫; Django正在管理数据库模式,没有其他人.
    3. 迁移历史记录与迁移文件之间存在不一致.[这是InconsistentMigrationHistory提问者所遭受的问题,也是我到达此页面时遇到的问题].为了管理这个,有人手动搞乱了django_migrations表,或者在应用删除了迁移.要解决此问题,您将不得不弄清楚不一致的方式并手动解决它.如果您的数据库架构是正确的,并且只是您的迁移历史记录错误,您可以手动编辑该django_migrations表来解决此问题.如果您的数据库架构错误,那么您还必须手动编辑它以使其与应有的一致.

根据您对问题的描述和您选择的答案,我将假设您是独自工作的,是Django的新手,并且不关心您的数据.所以核选项可能适合你.

如果你不是在这种情况下,上面的文字看起来像胡言乱语,那么我建议请求Django用户的邮件列表寻求帮助.那里有非常有帮助的人可以帮助您解决您所处的具体问题.

有信心,你可以解决这个错误而不去核!

  • 对于那些感兴趣的人:就我而言,当我等待我的同事完成自定义迁移以将表从应用程序 A 移动到应用程序 B 时,我创建了一个临时迁移来在应用程序 B 中创建表。当我的同事完成后,我恢复了我的临时迁移并去应用迁移。巴姆错误。我不仅忘记取消应用我的临时迁移,而且还设法将临时迁移命名为与实际迁移相同的名称。对于依赖于应用程序 A 的“00XX_auto”迁移的迁移系统应用程序 B 的“0001_initial”迁移,在其依赖之前以某种方式应用了! (2认同)
  • 听起来很可怕,很容易解决.我的数据库确实有正确的模式,所以我所要做的就是手动将''A''00XX_auto'"添加到`django_migrations`表中,这样我的历史记录就反映了该迁移的变化已被应用.一旦你解决了问题,就会变得复杂,但并不难. (2认同)

Arp*_*nki 23

数据库中的django_migrations表是不一致的原因,只删除本地路径中的所有迁移都不起作用.

您必须从数据库中截断django_migrations表,然后再次尝试应用迁移.它应该工作,但如果没有,那么再次运行makemigrations然后迁移.

注意:不要忘记备份您的数据.

  • 这是一个糟糕的想法,很可能会丢失数据。请参阅下面我的回答。 (5认同)
  • 没用 当我尝试迁移时,它抱怨说关系已经存在。请注意,您可以使用以下命令截断django_migrations表:&gt; django.db中的python manage.py shell```import connection cursor = connection.cursor()cursor.execute(“ TRUNCATE TABLE django_migrations”)```您可以查看像这样的迁移表:```从django.db.migrations.recorder导入MigrationRecorder MigrationRecorder.Migration.objects.all()``` (3认同)
  • 为了修复本地开发环境,这对我来说是正确的解决方案 - 实际上我只是清除了整个数据库,并通过所有迁移重新创建它。我的问题是我之前运行过旧版本的“0001_initial”迁移,但新版本不适用。如果您想要产品的干净迁移历史记录而无需进行不必要的更改,那么在将这些迁移发送到产品之前删除并重新生成本地开发中的迁移对我来说似乎很好。其他评论和答案指出删除/清除迁移不适用于产品数据库,这是事实。 (3认同)

Dr.*_*nni 16

这里如何妥善解决这个问题.

在项目内的迁移文件夹中执行以下步骤:

  1. 删除_pycache_和0001_initial文件.
  2. 从根目录中删除db.sqlite3(注意所有数据都将消失).
  3. 在终端上运行:
      python manage.py makemigrations
      python manage.py migrate

瞧.

  • 如果我们不想删除并且处于生产模式怎么办?另外,我没有使用“sqllite”,它是我们服务器中的 MySQL。有什么更好的方法而不丢失数据。 (2认同)

tbm*_*tbm 11

在执行任何其他步骤之前,请备份数据库。然后再次备份。

删除所有自定义用户模型代码,在设置中禁用自定义模型和应用程序,然后:

python manage.py dumpdata auth --natural-primary --natural-foreign > auth.json
python manage.py migrate auth zero  # This will also revert out the admin migrations
Run Code Online (Sandbox Code Playgroud)

然后添加您的自定义模型,在设置中进行设置,然后重新启用该应用程序。确保您尚未在此应用程序上进行迁移。

然后:

python manage.py makemigrations <your-app>
python manage.py migrate
python manage.py loaddata auth.json  # Assumes your user-model isn't TOO dissimilar to the standard one.
Run Code Online (Sandbox Code Playgroud)

完毕!


小智 10

问题

django.db.migrations.exceptions.InconsistentMigrationHistory:迁移admin.0001_initial在数据库'default'上的依赖项account.0001_initial之前应用。

因此,我们可以首先在没有admin(admin.0001_initial)的情况下迁移数据库。

迁移依赖项后,执行命令migration admin.0001_initial

  1. 从settings.py中的INSTALLED_APPS中删除“ django.contrib.admin”。
  2. 执行命令:

Python manage.py makemigrations应用程序名称

Python manage.py迁移应用名称

  1. 在settings.py文件中的INSTALLED_APPS中添加“ django.contrib.admin”。
  2. 再次执行命令:

$:Python manage.py makemigrations应用程序名称

$:Python manage.py迁移应用名称

  • 对我来说,从INSTALLED_APPS中删除“ django.contrib.admin”并运行makemigrations会导致“ LookupError:未安装带有标签” admin”的应用。 (4认同)
  • 转到urls.py并用admin注释掉url (2认同)
  • 通过遵循这两个建议为我工作。谢谢你! (2认同)

NaS*_*aiN 10

通过在迁移之前在settings.py中评论应用程序管理员来解决

django.contrib.admin
Run Code Online (Sandbox Code Playgroud)

在 urls.py 中,

('admin/', admin.site.urls)
Run Code Online (Sandbox Code Playgroud)

迁移后取消注释


小智 8

根据django文档中的建议,在添加自定义用户模型后,这在新项目中发生了。

如果您要开始一个新项目,强烈建议您设置一个自定义用户模型,即使默认用户模型足以满足您的需要。

这是我为解决问题所做的工作。

  1. 删除数据库db.sqlite3。
  2. 删除应用程序/迁移文件夹。

根据@jackson,暂时将django.contrib.admin注释掉。

INSTALLED_APPS = [
...
#‘django.contrib.admin’,
...
]
Run Code Online (Sandbox Code Playgroud)

还要在urls.py中注释掉管理站点:

urlpatterns = [
    path('profile/', include('restapp.urls')),
    #path('admin/', admin.site.urls),
]
Run Code Online (Sandbox Code Playgroud)

如果不注释路径('admin /'),则在运行时会出现错误“ LookupError:未安装带有标签'admin'的应用”

python manage.py migrate
Run Code Online (Sandbox Code Playgroud)

迁移完成后,请取消注释以上两项。


小智 6

只需删除所有文件migrations__pycache__.pyc文件:

find . | grep -E "(__pycache__|\.pyc|\.pyo$|migrations)" | xargs rm -rf
Run Code Online (Sandbox Code Playgroud)

然后,运行:

python manage.py makemigrations
python manage.py migrate
Run Code Online (Sandbox Code Playgroud)


Ama*_*yas 5

当您对默认用户模型进行一些更改或通过抽象用户创建自定义用户模型时,很多时候您会遇到该错误

1:请记住,当我们创建超级用户时,我们需要用户名和密码才能登录,但如果您转换了 USERNAME_FIELD = 'email' 那么现在您无法使用用户名和密码登录,因为您的用户名字段已转换为电子邮件......

所以现在它会显示如下:

如果您尝试创建另一个超级用户,那么它不会要求用户名,它只会要求电子邮件和密码,然后在通过电子邮件和密码创建超级用户后,仅当您尝试登录管理面板时,它才会抛出该错误,因为有不需要任何用户名和用户名字段 创建超级用户时出错

2:这就是为什么在迁移过程中创建自定义用户模型后会抛出错误,因此为了解决它,首先添加 AUTH_USER_MODEL = 'appname.custommodelname' (appname 是您定义自定义用户模型的应用程序名称,自定义模型名称是3:然后删除您在其中创建自定义用户模型的应用程序的迁移文件夹,然后删除项目的数据库 db.sqlite3 4:现在运行迁移 python 管理。 py makemigrations appname(您定义自定义用户模型的应用程序名称) 5:然后通过 python manage.py migrate 迁移它 6:就是这样,现在完成了