防止 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)

在推送到 Codecommit 时需要特定的提交消息 AWS Lambda

Django - 我如何将“.json”文件插入 SQLite DB?