Heroku / Django的数据库问题:每次推送后都不会保留信息

时间:2018-09-30 23:53:56

标签: python django heroku django-models

每次我在Heroku上对生产中的数据库进行更改,然后执行一次推送,数据库就会重置为本地计算机上的任何内容。我尝试将db.sqlite3__pycache__添加到.gitignore,但这是行不通的。

有人知道该问题怎么办吗?

更新(将设置更改为):

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': os.path.join(BASE_DIR, 'thesite'),
        'USER': 'tom',
        'PASSWORD': '!'
    }
}

并添加

import os
import psycopg2

DATABASE_URL = os.environ['DATABASE_URL']

conn = psycopg2.connect(DATABASE_URL, sslmode='require')

import dj_database_url
DATABASES['default'] = dj_database_url.config()

1 个答案:

答案 0 :(得分:1)

Heroku's filesystem is ephemeral:下次重新启动测功机时,您对文件所做的任何更改都会丢失,happens frequently(每天至少一次)。由于SQLite是基于文件的数据库,因此与Heroku不兼容。

您可以改用客户端服务器数据库。 Heroku自己的PostgreSQL add-on应该已经为您设置了,但是您可以根据需要使用several others中的任何一个。

dj-database-url可以为您简化此操作:它使您可以从DATABASE_URL环境变量设置数据库配置,该变量应该已经由Heroku Postgres进行了设置。

下面是一个示例,说明如何使用dj-database-url来使用DATABASE_URL环境变量(如果不存在)以及如何退回到另一个数据库:

DATABASES['default'] = dj_database_url.config(default='sqlite://db.sqlite3')

我已经展示了一个可以追溯到SQLite的示例,但实际上,我 strongy 建议在所有环境中使用相同的数据库引擎。 Django的ORM可帮助“平衡”不同的数据库引擎,但仍然存在差异。您不希望自己的代码在本地使用SQLite工作,但在PostgreSQL中无法生产。