【问题标题】:makemigrations does not work after deleting migrations删除迁移后 makemigrations 不起作用
【发布时间】:2015-10-27 15:22:50
【问题描述】:

我错误地删除了路径projectName/appName/migrations下的所有.py文件,其中包括:

0001_initial.py

0011_auto_20150918_0723.py

0002_auto_20150819_1301.py

...

现在,即使我更新了 Model 文件,并运行命令python manage.py makemigrations,它总是提示 No changes detected

我怎样才能恢复一切?

【问题讨论】:

    标签: python django django-migrations


    【解决方案1】:

    首先,即使你在生产中遇到这种情况不要惊慌

    当您删除所有迁移时,django 忘记了这个应用程序应该由迁移管理。 Django 默认回到旧的 python manage.py syncdb 无迁移行为,并且在您运行 python manage.py makemigrations 时不会尝试检测更改或生成新迁移

    为了让它知道迁移,你必须专门为你的应用运行命令:

    python manage.py makemigrations appName
    

    但是,对于您正在运行的应用程序,django 将无法检测到数据库中已经应用了新的迁移,并且会在您运行 python manage.py migrate 时再次尝试运行它们。

    当这种情况发生时,迁移失败,说relation appName.XYZ already exists!

    要让 django 了解您的迁移已经反映在数据库中,您必须伪造它们:

    python manage.py migrate appName --fake
    

    这将更新迁移历史记录表并将您的迁移标记为已应用,但不会尝试在数据库中创建表。

    更新(感谢@GwynBleiD):

    这里的一个问题是,已应用的已删除迁移将列在数据库的迁移历史记录表中。这对于初始的python manage.py makemigrations myApp 来说不是问题,但是对于任何其他迁移,它将引发关于inconsistent migration history 的错误。

    为避免这种情况,您必须手动从数据库中的 django_migrations 表中删除任何引用不存在迁移的行。

    【讨论】:

    • 这里的一个问题是:如果删除的迁移已经被应用,它们将被列在数据库的迁移历史表中——对于初始迁移它不会是一个问题,django 会忽略它,但对于任何其他迁移它会抛出关于不一致的迁移历史的错误。为避免这种情况,您必须手动删除数据库中 django_migrations 表中引用不存在迁移的任何行。
    • 我不建议没有经验的用户使用假运行,因为它需要手动恢复。来自文档:“这是供高级用户在手动应用更改时直接操纵当前迁移状态的;请注意,使用 --fake 会冒着将迁移状态表置于手动恢复状态的风险需要>使迁移正确运行。”
    猜你喜欢
    • 2017-07-24
    • 2015-01-10
    • 2017-03-07
    • 1970-01-01
    • 2019-08-29
    • 2013-11-26
    • 2014-04-10
    • 1970-01-01
    • 2017-05-27
    相关资源
    最近更新 更多