【问题标题】:500 error on production server after model update模型更新后生产服务器上出现 500 错误
【发布时间】:2016-04-17 13:43:53
【问题描述】:

我在 Heroku 上部署了一个新的 django 应用程序,效果很好。但是,今天我稍微更改了我的模型(添加了一个新字段),然后删除了我的开发服务器文件 db-sqlite3 和迁移文件夹,以反映开发数据库中的更改。这在本地服务器上运行良好,但是当我将其推送到 heroku 时,尝试访问 django-admin 部分中的模型时出现 500 错误。

我尝试通过 heroku 运行一些迁移,但收到以下错误消息:

 ! These migrations are in the database but not on disk:
    <joins: 0002_auto__add_field_join_ip_address>
    <joins: 0003_auto__add_unique_join_email>
    <joins: 0004_auto__add_field_join_ref_id>
    <joins: 0005_auto__add_unique_join_email_ref_id>
    <joins: 0006_auto__add_unique_join_ref_id>
    <joins: 0007_auto__del_unique_join_ref_id>
    <joins: 0008_auto__del_unique_join_email__add_unique_join_ref_id>
    <joins: 0009_auto__add_field_join_friend>
 ! I'm not trusting myself; either fix this yourself by fiddling
 ! with the south_migrationhistory table, or pass --delete-ghost-migrations
 ! to South to have it delete ALL of these records (this may not be good).
(lwc) Daniels-MacBook-Pro:src danielrichter$ heroku run python manage.py migrate --delete-ghost-migrations

我可以看到,在我的本地迁移文件夹中,我只有 0001_initial 迁移并且不知何故错过了另一个,但我不知道如何解决这个问题。

我看到其他人遇到相同的错误消息,但我不理解建议的答案,因为我对 Django 和一般编码都很陌生。因此,如果有人可以给我提示如何解决这个问题,我将非常感激!

非常感谢!

【问题讨论】:

    标签: django database heroku django-models migration


    【解决方案1】:

    显然数据库认为您已经应用了消息中提到的迁移,但它在磁盘上找不到文件。你确认。也许您的版本管理有问题并且您丢失了这些文件?我会尝试看看您是否可以恢复文件,然后问题就会结束。

    如果没有,那就有点困难了。提到的迁移可能已经执行,但文件丢失了。您还进行了尚未应用的新更改。您应该尝试将您的代码状态恢复到执行上次丢失迁移的状态。然后,您可以创建一个新的迁移文件 (python manage.py schemamigration --auto your_app_name),它可以替换丢失的迁移文件。此迁移将被称为 0002_something(0001 存在,0002 是下一个)。在此替换迁移之后,您可以进行新的迁移(0003 及更多)。

    在服务器上,在更新您的代码版本之前(因此您还没有 0002)执行 python manage.py migrate --delete-ghost-migrations。这将删除对丢失迁移的引用。之后您可以更新您的版本并获得新的 0002 等迁移。

    致电python manage.py migrate --fake your_app_name 0002。这将告诉数据库已应用迁移,而不实际应用任何内容。这很好,因为丢失的迁移文件已经应用了更改。

    在此之后,您可以运行正常的迁移:python manage.py migrate,它应该是好的。

    希望这会有所帮助。

    【讨论】:

    • 非常感谢卢卡斯!错误消息消失了,现在我唯一的问题是每次我进入 django-admin 部分并尝试访问我已更改的模型时,已部署的应用程序都会引发 500 错误。但是,在开发服务器上一切正常,我该如何解决这个问题?
    • 你设置了DEBUG=True,这样你就可以看到实际的错误了吗? 编辑: 啊,我从下面的帖子中看到了。您在数据库中缺少一个字段。您是否签入了该字段正在添加到数据库的最后一个迁移文件?
    【解决方案2】:

    然后删除了我的开发服务器文件 db-sqlite3 和 migrations 文件夹以反映开发中的变化 数据库

    这是您的问题,您不应该删除任何迁移文件,如果您在数据库中进行更改,django(或南)将为这些更改创建一个新的迁移文件,然后您运行迁移命令来应用这些更改您的数据库,您必须提交这些新的迁移文件并将它们发送到 heroku,因此这些更改也将应用于远程数据库。

    工作流程是这样的:

    1. 您有一些迁移文件或初始文件

    2. 通过添加/删除字段来编辑模型

    3. 在 django 中创建迁移文件(没有 South):

      python manage.py makemigrations

    4. 通过运行将这些更改应用到本地数据库:

      heroku run python manage.py migrate

    5. 将这些模型更改和迁移文件添加到您的 git 索引中

    6. 将更改推送到 heroku 并运行迁移命令:

      heroku run python manage.py migrate

    【讨论】:

    • 感谢@ahmed,我按照您的说明进行操作(但是使用 Django 1.6 schemamigrations myapp --auto 而不是 makemigrations),现在我在生产服务器上将调试模式设置为 true 以查看发生了什么我看到ProgrammingError at / column joins_join.wunschrad does not exist LINE 1: SELECT "joins_join"."id", "joins_join"."email", "joins_join"... 我很清楚,我在模型中添加的字段不存在,但是我怎么能添加它,我做了所有事情,从迁移到同步数据库,在 heroku 和本地服务器上,甚至检查了服务器上的models.py文件
    • 当我运行 heroku run python manage.py migrate joins 时,bash 返回 Running migrations for joins: - Nothing to migrate. - Loading initial data for joins. 所以迁移端没有真正的错误消息,本地应用程序运行良好,但服务器上存在一些问题,我什至创建了一个新的 heroku 应用程序,但同样的事情正在发生;我在想这可能是 git 中的代码有问题,我必须刷新它并重新推送它,但这只是一个猜测
    • 您的 Heroku 存储库中是否还有已删除的迁移文件?如果是,您可以拉取它们并删除您当前的本地数据库并添加新的迁移文件(步骤 5)
    猜你喜欢
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 2014-06-11
    • 2012-12-01
    • 1970-01-01
    • 2013-05-30
    • 2018-08-28
    • 1970-01-01
    相关资源
    最近更新 更多