Heroku 应用程序数据库重置

8
在完成Heroku上的Python入门后,我启动了我的第一个应用程序。一切似乎都很正常,但是过了一会儿(可能几个小时),数据库就重置了。根本原因的假设是我的django应用程序正在使用默认的django数据库(我认为是SQLite),而Heroku默认支持Postgres。我还没有测试这个假设,因为如果我不得不改变我的应用程序到postgres,这似乎需要很多工作,而且我宁愿现在不这样做。
总之,我的问题是,由于我的应用程序使用SQLite,我的数据库是否无法保存?如果是这样,为什么我的应用程序仍能工作?如果不是,解决问题的第一个地方在哪里?

3
是的,你不能在Heroku上使用sqlite。更改数据库并不是“很多工作”,只需要更改一个设置即可。 - Daniel Roseman
1个回答

10

正如@DanielRoseman所说,你不应该在Heroku上使用SQLite,因为SQLite在内存中运行,并将其数据存储备份到磁盘文件中。

SQLite在内存中运行,将其数据存储备份到磁盘文件中。虽然这种策略对于开发来说效果很好,但Heroku的Cedar堆栈具有临时文件系统。您可以向其中写入并从中读取,但内容将定期清除。如果您在Heroku上使用SQLite,则每24小时至少会丢失整个数据库。

即使Heroku的磁盘是持久性的,运行SQLite仍然不是一个好选择。由于SQLite不作为服务运行,因此每个dyno都会运行单独的副本。每个副本都需要自己的磁盘备份存储。这意味着支持您应用程序的每个dyno将具有不同的数据集,因为磁盘未同步。

与其在Heroku上使用SQLite,不如配置您的应用程序运行Postgres。

在Django中使用Postgres非常简单。您只需要在设置文件中更改数据库适配器:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'mydb',                     
        'USER': 'myuser',
        'PASSWORD': 'password',
        'HOST': 'localhost',                      # Empty for localhost through domain sockets or           '127.0.0.1' for localhost through TCP.
        'PORT': '',                      # Set to empty string for default.
    }
}

Heroku文档中还有一篇关于如何在Heroku上设置Django应用程序的教程:

https://devcenter.heroku.com/articles/django-app-configuration


我无法让dj_database_url正常工作,所以在我发现你可以在Heroku仪表板上的自己的Postgres数据库的数据库URL中找到所有细节后,最终使用了上述设置。该URL看起来像postgres://USER:PASSWORD@HOST:PORT/NAME。 - jazzabeanie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接