防止 Django SQLite db 在推送到 Heroku 时被覆盖
Posted
技术标签:
【中文标题】防止 Django SQLite db 在推送到 Heroku 时被覆盖【英文标题】:Prevent Django SQLite db from being overwritten while pushing to Heroku 【发布时间】:2014-07-07 11:07:38 【问题描述】:我有一个 Django 应用程序,它在它的模型中存储了大量数据。问题是,每当我部署到 Heroku 时,即使是很小的变化,具有正确数据的远程数据库都会被本地虚拟数据数据库覆盖。
场景:
我有一个远程数据库文件my_db
。现在,当推送到 heroku 时,我只是 git add
> git commit
仅包含更改的文件而不是整个项目。我的问题在于,它仍然以某种方式用本地数据覆盖远程数据库。
有没有办法防止这种情况发生?
【问题讨论】:
【参考方案1】:Heroku does not provide a persistent filesystem.
我参与过的大多数 Heroku 应用程序都使用 PostgreSQL 作为他们的数据库,所以这不是问题。但是 SQLite 只是一个位于某个目录中的文件,所以每次部署数据库都会丢失。
最简单的解决方案可能是从 SQLite 迁移到 PostgreSQL,这在 Heroku(和 Django)上得到了很好的支持,并且每次部署都不会丢失数据。
如果您坚定地致力于 SQLite,您可能还有其他一些选择:
在每次推送之前备份您的数据库文件,并在推送之后恢复它。 将您的生产数据库添加到您的 Git 存储库,这样它将与您的应用程序一起部署(请注意,我不建议这样做)。 许多用户use Amazon S3 to store other types of assets。您也许可以对您的数据库使用类似的过程,但我怀疑这样做会带来一些非常严重的安全风险。【讨论】:
您如何执行选项 #2,即将生产数据库添加到您的 git 存储库? @devhaven.herokuapp.com,我强烈建议不要这样做,但您只需像任何其他文件一样将数据库文件添加到存储库中,并确保根据需要提交更改。请注意,如果您打算修改 Heroku 上的数据库,则此选项是一个特别糟糕的主意:我认为您不能在那里提交更新,并且临时文件系统可能仍然是一个问题。例如,如果您将它用作只读设置数据库,它会工作得相当好。请认真考虑迁移到 PostgreSQL(或其他受支持的客户端-服务器数据库)。【参考方案2】:您应该将 db 文件添加到 .gitignore
【讨论】:
这是一个有效的答案。但是,知道为什么它仍然会覆盖我的所有文件吗? 我只能猜测,因为我不知道 heroku 或您如何设置部署。但是,即使您没有添加或提交本地 db 文件,看起来您的存储库中仍然存在它的一个版本。如果通过签出部署代码更改,则该数据库文件将覆盖您的生产数据库以上是关于防止 Django SQLite db 在推送到 Heroku 时被覆盖的主要内容,如果未能解决你的问题,请参考以下文章
如何查看 django sqlite3 db 的数据库和模式
ABPersonViewController 在推送到 PeoplePickerNavigationController 时未检索数据
不忽略 db.sqlite3 文件,即使我在 django 项目的 .gitignore 中指定
如何在推送到 PyPi 之前测试 PyPi 安装是不是有效? (Python)