我在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和编码很新。所以,如果有人能给我一个如何解决这个问题的提示,我将非常感激!
非常感谢!答案 0 :(得分:0)
显然,数据库认为您已应用了邮件中提到的迁移,但它无法在磁盘上找到这些文件。你确认。也许你的版本管理出了问题,你丢失了这些文件?我试着看看你是否可以恢复文件,然后问题就会结束。
如果没有,那就有点难了。提到的迁移可能已经执行但文件丢失了。您还进行了尚未应用的新更改。您应该尝试将代码状态恢复到执行上次丢失迁移的状态。然后,您可以创建一个新的迁移文件(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
,它应该是好的。
希望这有帮助。
答案 1 :(得分:0)
然后删除了我的开发服务器文件db-sqlite3和 迁移文件夹以反映开发中的更改 数据库
这是您的问题,您不应删除任何迁移文件,如果您在数据库中进行更改,django(或南方)将为这些更改创建新的迁移文件,然后运行迁移命令以应用这些更改更改数据库,您必须提交这些新的迁移文件并将它们发送到heroku,因此更改也将应用于远程数据库。
工作流程如下:
在django(没有南方)中创建迁移文件:
python manage.py makemigrations
通过runnig:
将这些更改应用到本地数据库 heroku run python manage.py migrate
将更改推送到heroku并运行迁移命令:
heroku run python manage.py migrate