我目前正在将一个项目部署到Heroku,但它返回以下错误:ValueError:无法解析相关模型"store.user"。
但有一种方法可以在本地避免这种错误。你只需:
py manage.py migrate store
然后
py manage.py migrate
换句话说,如果我单独迁移,我就不会面临这样的错误。然而,Heroku会一起迁移,然后部署会因为这个错误而失败。
如果我像Heroku那样在本地进行,即运行
py manage.py migrate
我可以毫不费力地点击并删除db.sqlite3文件,并分别进行迁移和迁移。然后这个问题就会得到解决。然而,当部署到Heroku时,这是不可能的。因此,如何仅通过终端删除此文件?我一直在搜索,但人们只说你点击文件并删除它,这对我来说是不可能的。
感谢
然而,Heroku将所有迁移到一起,然后部署失败,因为这个错误
Heroku不做任何事情。
只有当你告诉Heroku时,迁移才会在Heroku上运行,或者运行之类的程序
heroku run python manage.py migrate
或者因为您已经声明了一个发布过程,该过程应该在部署新版本时运行,例如:
web: gunicorn app.wsgi
release: python manage.py migrate
在这两种情况下,都由您负责该命令。如果您不想每次部署都运行python manage.py migrate
,请从Procfile
中删除release
进程。
如果我单独迁移,我不会面临这样的错误
这令人担忧。
这可能有几个原因。一个常见的问题是迁移中缺少依赖项。如果您在app1
中编写的迁移依赖于现有app2
中的某些模型和表,则需要在app1
中为相关迁移添加依赖项,例如文档中的以下示例:
class Migration(migrations.Migration):
dependencies = [
('app1', '0001_initial'),
# added dependency to enable using models from app2 in move_m1
('app2', '0004_foobar'),
]
operations = [
migrations.RunPython(move_m1),
]
如果迁移编写正确,以便它们准确地反映每次提交中的代码,相互构建,声明依赖关系等,那么您应该始终能够将它们安全地应用于数据库。
最后,您询问有关删除db.sqlite
的问题。
Heroku的文件系统是短暂的。它在构建时会被烘焙到你的应用程序中,每次你的dyno重新启动时,你对它所做的任何更改都会被重置。这种情况经常发生(每天至少一次(。
这意味着您无法有效地删除数据库文件。但这也意味着你不能保存数据,并期望它在以后查找时出现!SQLite不太适合Heroku。
像PostgreSQL这样的客户端-服务器数据库是一个更好的选择。Heroku提供自己的免费Postgres服务。
如果你转换,我强烈敦促你也转换开发。Django的ORM使更改相对容易,但数据库引擎并不是彼此的替代品。我见过在SQLite上开发并部署到Postgres或MySQL会导致开发中的生产失败的真实例子。