Heroku 应用程序数据库重置

jaz*_*nie 7 django heroku

在 Heroku 上运行 Python 入门后,我启动了我的第一个应用程序。一切似乎都运行良好,但过了一会儿(可能是几个小时),数据库会重置。我对根本原因的假设是我的 django 应用程序使用默认的 django 数据库(我认为是 SQLite),而 Heroku 默认支持 postgres。我还没有测试过这个,因为将我的应用程序更改为 postgres 似乎需要做很多工作,如果我不需要,我现在不想这样做。

总之,我的问题是,由于我的应用程序使用 SQLite,我的数据库没有保存吗?如果是这样,为什么我的应用程序可以正常工作?如果没有,我应该首先寻找解决问题的地方在哪里?

ils*_*005 9

正如@DanielRoseman 所说,您不应该在 heroku 上使用 SQLite,因为 SQLite 在内存中运行,并将其数据存储在磁盘上的文件中。让我引用 heroku doku 的话:

SQLite 在内存中运行,并在磁盘上的文件中备份其数据存储。虽然这种策略适用于开发,但 Heroku 的 Cedar 堆栈有一个临时文件系统。您可以写入它,也可以从中读取,但内容将被定期清除。如果您要在 Heroku 上使用 SQLite,您将至少每 24 小时丢失一次整个数据库。

即使 Heroku 的磁盘持续运行 SQLite,它仍然不适合。由于 SQLite 不作为服务运行,因此每个 dyno 将运行一个单独的运行副本。这些副本中的每一个都需要自己的磁盘支持存储。这意味着为您的应用程序供电的每个 dyno 将具有不同的数据集,因为磁盘未同步。

您可以将应用程序配置为在 Postgres 上运行,而不是在 Heroku 上使用 SQLite。

在 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.
    }
}
Run Code Online (Sandbox Code Playgroud)

在他们的文档部分还有一个关于如何在 herku 上设置 django 应用程序的教程:

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